关于主键约束enable和disable的问题

来源:互联网 发布:普鲁士号实际数据 编辑:程序博客网 时间:2024/06/03 05:13

当我们在创建主键约束的时候,会自动创建一个唯一索引(唯一约束也是如此)

其实对于主键约束而言,它是非空约束+唯一约束的组合。而自动创建的唯一索引,就是用来实现唯一性这一规则的。

当我们disable掉主键约束后,它会自动删掉当初自动创建的唯一索引。

同理,当我们enable主键后,它又会自动创建唯一索引。

另外,当我们disable约束后,像主键中插入null值后是被允许的,但当我们再次enable主键约束,便会报错:

SQL> insert into test values(null);
1 row created.
SQL> commit;
Commit complete.
SQL> alter table test enable constraint pk_id;
alter table test enable constraint pk_id
*
ERROR at line 1:
ORA-02437: cannot validate (SYS.PK_ID) - primary key violated

所以,对于约束enable过程,又涉及到一个对原有数据是否做约束检查问题。

对于上述情况,可以novalidate,即允许原有数据中存在不符合主键约束的值:

SQL> alter table test enable novalidate constraint pk_id;
Table altered.

但是,约束启用后,就不允许有违反约束的值了

SQL> insert into test values(null);
insert into test values(null)
                        *
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SYS"."TEST"."ID")

------------------------------------------------------------------------------------------

记录一些细节,有时候真是记不清。

阅读全文
0 0