其实这个东西网上一搜一大堆,总结出来就是两句话:
启用约束:
enable( validate) :启用约束,创建索引,对已有及新加入的数据执行约束,validate关键字可省略。
enable novalidate :启用约束,创建索引,仅对新加入的数据强制执行约束,而不管表中的现有数据。
禁用约束:
disable( novalidate):关闭约束,删除索引,可以对约束列的数据进行修改等操作,novalidate关键字可省略。
disable validate :关闭约束,删除索引,不能对表进行插入/更新/删除等操作。
其实,我们经常遇到的就是 enalbe validate ,这个是创建约束的时候最常用到的。而disable novalidate是我们禁用约束时候经常用到的。所以我们来试试剩下两个的效果。
我们首先来创建一个测试表
create table TEST (ID number) ;
好,现在来测试disable validate,这个约束一旦加上,则表不能进行DML操作,所以我们现在直接对刚才的创建的表添加这个约束。
alter table TEST add constraint pk_test_id primary key(ID) disable validate
现在我们插入一条数据
insert into TEST (ID) values (1);
结果如下:
ORA-25128: 不能对带有禁用和验证约束条件 (CQZF.PK_TEST_ID) 的表进行插入/更新/删除
结果非常明显了吧。现在,我们试试enable novalidate.
首先,我们把现在TEST表的约束修改成disable并插入两个相同ID的数据。
alter table TEST disable novalidate constraint pk_test_id;
insert into TEST (ID) values (1);
1 row inserted
insert into TEST (ID) values (1);
1 row inserted
commit;
现在再把约束修改为enable novalidate
alter table TEST enable novalidate constraint pk_test_id;
结果是
ORA-02437: 无法验证 (CQZF.PK_TEST_ID) - 违反主键
按照最上面所说的,enable novalidate不是不校验已经存在的数据吗?难道不是?
其实呢,enable novalidate确实不会校验已经存在的数据,出现这个报错,是因为创建约束的时候,会随着创建一个唯一索引,而已经存在的数据为了唯一索引的约束。所以我们先针对ID字段创建一个普通索引
create index i_test_id on TEST(ID) ;
Index created
OK,现在我们再执行
alter table TEST enable novalidate constraint pk_test_id;
Table altered
成功。