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

ef1yzkbh  于 2023-03-29  发布在  Oracle
关注(0)|答案(5)|浏览(144)

除了删除并重新创建表之外,是否还有其他方法可以修改表上的现有检查约束

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
lb3vh1jj

lb3vh1jj1#

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

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

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

9gm1akwq

9gm1akwq2#

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

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

kulphzqa3#

不,你不能用别的方法做这件事。

mwg9r5ms

mwg9r5ms4#

没有。如果这样的特性存在,它会在这个语法说明中列出。(尽管可能有一个未记录的SQL特性,或者可能有一些我不知道的包。)

ddhy6vgd

ddhy6vgd5#

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;

相关问题