【问题标题】:How to delete Not null constraint in SQL? [duplicate]如何在 SQL 中删除 Not null 约束? [复制]
【发布时间】:2015-09-25 17:25:45
【问题描述】:

我刚刚创建了一个如下表:

CREATE TABLE EMP 
  ( 
     ENO     NUMBER(5, 0) not null, 
     ENAME   VARCHAR2(20 BYTE), 
     SAl     NUMBER(10, 0), 
     DPTNAME VARCHAR2(50 BYTE), 
     EPLACE  VARCHAR2(20 BYTE), 
     DOB     DATE 
  );

现在我想禁用 NOT NULL 约束。我试过ALTER TABLE EMP MODIFY (ENO NOT NULL DISABLE);,但它显示了一些错误。

你能告诉我哪里出错了吗?

【问题讨论】:

  • but it showing some error: 什么错误? ENO 是 FK 吗?你试过ALTER TABLE EMP MODIFY (ENO NULL);之类的吗?

标签: sql oracle oracle-sqldeveloper


【解决方案1】:

您可以使用 Sachu 的回答来放弃约束(顺便说一句,我认为这不值得投反对票)。

要禁用约束,您首先需要找到它的名称,它是由 Oracle 生成的。您可以在 Oracle 的 USER_CONSTRAINTS 视图中找到名称:查找“搜索条件”为 "ENO" IS NOT NULL 的名称——在您的问题中,这将是表中唯一的约束,但在其他情况下可能存在多个约束在桌子上(甚至在柱子上)。

SQL> CREATE TABLE EMP
   2 (
   3 ENO     NUMBER(5, 0) not null,
   4 ENAME   VARCHAR2(20 BYTE),
   5 SAl     NUMBER(10, 0),
   6 DPTNAME VARCHAR2(50 BYTE),
   7 EPLACE  VARCHAR2(20 BYTE),
   8 DOB     DATE
   9 );

Table created.

SQL> SELECT CONSTRAINT_NAME, SEARCH_CONDITION
  2  FROM USER_CONSTRAINTS
  3  WHERE TABLE_NAME = 'EMP';

CONSTRAINT_NAME SEARCH_CONDITION
--------------- -----------------
SYS_C009208     "ENO" IS NOT NULL

所以 Oracle 给约束的名称是 SYS_C009208。现在你可以禁用它了:

SQL> ALTER TABLE EMP DISABLE CONSTRAINT SYS_C009208;

Table altered.

【讨论】:

  • 您将NOT NULL 约束与所有其他约束混淆了。在 Oracle 中,NOT NULL 是唯一可以在不知道约束名称的情况下删除的约束。对于所有其他约束,您需要知道约束名称。
  • 您也可以在不知道其名称的情况下删除 PK 约束:ALTER TABLE myTable DROP PRIMARY KEY。除此之外,我没有在这里展示如何 drop 约束;我正在展示如何 disable 它(OP 在标题中使用了“drop”,但在问题中使用了“disable”)。有很大的不同,因为您可以禁用 NOT NULL 约束,添加空列值,然后使用 ENABLE NOVALIDATE 重新启用约束,并且允许现有的空值。您不能通过删除/重新添加来做到这一点。当然,您可能不想使用已发布的表结构来执行此操作 :)
  • 公平地说,OP 在标题中说 DELETE(这意味着 DROP),而在问题中说 DISABLE。
【解决方案2】:

试试

ALTER TABLE EMP MODIFY (ENO null);

【讨论】:

  • 工作正常。你能告诉我如何只删除列数据而不是列名吗?
  • 不明白你的意思是你需要删除特定列中的所有数据或使其为空?
  • @downvoter 你能告诉我这个答案有什么问题吗……它对我有用
  • 是的,我需要特定列下的所有数据
  • Update EMP set ENO = null 如果您不想检查任何条件,请附上条件
猜你喜欢
  • 2016-09-19
  • 2023-03-11
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多