当我们在创建主键约束的时候,会自动创建一个唯一索引(唯一约束也是如此)
其实对于主键约束而言,它是非空约束+唯一约束的组合。而自动创建的唯一索引,就是用来实现唯一性这一规则的。
当我们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")
------------------------------------------------------------------------------------------
记录一些细节,有时候真是记不清。