enable validate/novalidate 以及 disable validate/novalidate

来源:互联网 发布:c语言的排序算法 编辑:程序博客网 时间:2024/05/22 08:37

其实这个东西网上一搜一大堆,总结出来就是两句话:

启用约束:

        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

成功。

原创粉丝点击