如何修改现有的检查约束?


74

除了删除并重新创建以外,是否可以修改表上的现有检查约束 ?

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

我认为问题在于您必须围绕自己的表情,并且在“检查”之后必须有一个空格
enrique manzano gil 18/08/22

Answers:


125

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

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

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


2
如果没有与数据库的连接,这很好。在一般情况下进行更改之前,请参阅答案。
Marmite Bomber

1
针对表的DDL需要对其进行X锁定,但是事务可能会在两者之间潜行。我猜更好的方法是创建新约束,删除旧约束,将新约束重命名为旧约束名称。但是,在发布的案例中,这两个约束是互斥的。
亚当·穆奇

8

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

  • 约束始终存在
  • 现有行不违反新约束
  • 在删除约束之后和应用新约束之前,不会尝试进行任何非法的INSERT / UPDATE。

如果要保留约束的名称,则此方法将无效。您需要先删除约束,然后创建一个新约束。
kovalensue


0

否。如果存在这样的功能,则会在此语法说明中列出。(尽管可能存在未记录的SQL功能,或者也许有些我不知道的软件包。)


2
这正是问题所在。此功能 列出的文档。但这是行不通的。
schurik

9
修改约束已记录在案,但您要查找的特定更改类型未记录在案。只允许更改约束状态。如启用,禁用,验证等
乔恩·海勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.