【问题标题】:how to modify an existing check constraint?如何修改现有的检查约束?
【发布时间】:2011-07-01 22:47:44
【问题描述】:

有没有办法修改表上现有的检查约束 除了删除并重新创建它

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

【问题讨论】:

  • 我认为问题在于你把你的表情包围起来,在“检查”之后它必须是一个空格

标签: oracle ora-00933


【解决方案1】:

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

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

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

【讨论】:

  • 如果没有与数据库的连接,这很好。在一般情况下进行更改之前,请参阅this 答案。
  • 针对表的 DDL 需要针对它的 X 锁,但事务可能会潜入两者之间。我想更好的方法是创建新约束,删除旧约束,将新约束重命名为旧约束名称。然而,在发布的案例中,这两个限制是互斥的。
【解决方案2】:

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

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

【讨论】:

  • 如果您想保留约束的名称,这将不起作用。您需要先删除约束,然后再创建一个新约束。
  • 你仍然可以做一个技巧:1/用一个临时名称创建新的约束。 2/ 删除原始约束,因此它的名称将可用。 3/ 使用最终名称创建新约束的第二个副本。 4/ 删除临时约束。
【解决方案3】:

不,你不能这样做。

【讨论】:

    【解决方案4】:

    没有。如果存在这样的功能,它将在此syntax illustration 中列出。 (尽管可能存在未记录的 SQL 功能,或者可能有一些我不知道的包。)

    【讨论】:

    • 这正是问题所在。此功能列在 documentation 中。但它不起作用。
    • 已记录修改约束,但未记录您要查找的特定更改类型。只允许更改约束状态。例如启用、禁用、验证等
    猜你喜欢
    • 2011-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-13
    • 2015-09-05
    • 1970-01-01
    • 2020-09-20
    • 2013-01-23
    相关资源
    最近更新 更多