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

88

有没有一种方法可以修改表中现有的检查约束,而不是删除并重新创建它

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

我认为问题在于您将表达式括起来,而在“check”之后必须有一个空格。 - enrique manzano gil
5个回答

150

您需要删除并重新创建它,但如果您不想重新验证数据,则无需承担重新验证数据的成本。

alter table t drop constraint ck ;
alter table t add constraint ck check (n < 0) enable novalidate;
enable novalidate子句将强制执行约束条件,但不会强制对表进行完整的扫描以验证所有行是否符合要求。

3
如果没有与数据库的连接,那么这没问题。在通用情况下进行更改之前,请参阅此答案 - Marmite Bomber
3
对表执行DDL需要对其施加X锁,但是在两者之间可能会有事务偷偷插入。我猜更好的方法是创建新约束,删除旧约束,将新约束重命名为旧约束名称。然而,在所发布的情况下,这两个约束彼此是排他的。 - Adam Musch

13

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

  • 保持约束始终有效
  • 现有行不会违反新的约束条件
  • 在删除约束和应用新约束之前不会尝试非法的INSERT/UPDATE操作。

如果你想保留约束的名称,那么这个方法行不通。你需要先删除约束,然后创建一个新的。 - kovalensue
2
你仍然可以使用一个技巧:1/ 使用临时名称创建新的约束。2/ 删除原始约束,以便其名称可用。3/ 创建第二个带有最终名称的新约束的副本。4/ 删除临时约束。 - ThatsMe
3
@ThatsMe 为什么要创建一个带有最终名称的新约束的副本?为什么不跳过第三步,直接将临时约束重命名为原始约束呢? - DagdA
2
@DagdA,你说得完全正确! 你有这个检查约束:alter table test add constraint chk_id check (0 < id); 你想要更改它:alter table test add constraint tmp_id check (1 <= id); alter table test drop constraint chk_id; alter table test rename constraint tmp_id to chk_id; - ThatsMe

2

不,你不能用其他方式来实现它。


0

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


2
这正是问题所在。这个功能在文档中有列出。但它并不起作用。 - schurik
10
修改约束已有文档记录,但您需要的特定修改类型未被记录。只允许更改约束状态,例如启用、禁用、验证等。 - Jon Heller

-1
create table Gender_Long(id integer,gender varchar2(10), constraint Gender_Long_pk primary key(id));
create table Employee(id integer,name varchar2(10),gender integer, constraint Employee_pk primary key(id),
    constraint Employee_fk foreign key(gender) references Gender_Long(id));

insert into Gender_Long values(1,'male');
insert into Gender_Long values(2,'female');

insert into Employee values(1,'Raj',1);
insert into Employee values(2,'Maha',1);
insert into Employee values(3,'Devi',2);

create table Gender_Short(id integer,gender varchar2(10), constraint Gender_Short_pk primary key(id));

insert into Gender_Short values(1,'M');
insert into Gender_Short values(2,'F');

ALTER TABLE Employee add constraint Employee_fk2 foreign key(gender) references Gender_Short(id);

ALTER TABLE Employee DROP CONSTRAINT Employee_fk;

drop table Gender_Long;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接