83

除了删除和重新创建表之外,还有什么方法可以修改表上的现有检查约束 ?

create table t ( n number);
ora10g> Tabelle wurde erstellt.

ora10g> alter table t add constraint ck check(n>0);

Tabelle wurde geõndert.

ora10g> alter table t modify constraint ck check(n<0);
alter table t modify constraint ck check(n<0)
                                   *
FEHLER in Zeile 1:
ORA-00933: SQL-Befehl wurde nicht korrekt beendet
4

4 回答 4

137

您必须删除它并重新创建它,但如果您不想这样做,您不必承担重新验证数据的成本。

alter table t drop constraint ck ;
alter table t add constraint ck check (n < 0) enable novalidate;

enable novalidate子句将强制插入或更新以强制执行约束,但不会强制对表进行全表扫描以验证所有行是否符合。

于 2011-02-22T14:39:17.253 回答
12

首先创建一个新约束,然后删除旧约束。
这样您就可以确保:

  • 约束总是存在的
  • 现有行不违反新约束
  • 在您删除约束后和应用新约束之前,不会尝试非法 INSERT/UPDATE。
于 2017-06-01T08:02:06.547 回答
2

不,你不能这样做。

于 2011-02-22T12:02:13.450 回答
0

不。如果存在这样的功能,它将在此语法说明中列出。(虽然可能有一个未记录的 SQL 功能,或者可能有一些我不知道的包。)

于 2011-02-23T01:11:44.347 回答