关于约束ENABLE NOVALIDATE的一个疑问

http://www.dbunix.com/?p=188

关于约束ENABLE NOVALIDATE的一个疑问

CREATE TABLE test
(id varchar2(12), name varchar2(30) ,CONSTRAINT pk_test PRIMARY k   ALTER TABLE test disable CONSTRAINT pk_test

然后向表中插入两条完全一样的数据并commit

我的印象是ENABLE NOVALIDATE并不检查已经存在的数

SQL> ALTER TABLE test enable novalidate constra
ALTER TABLE test enable novalidate CONSTRAINT p * ERROR 位于第 1 行: ORA-02437: 无法验证 (DBO.PK_TEST) - 违反主键

参考hrb_qiuyb文章

SQL> CREATE TABLE t(a INT,b varchar2(20));   TABLE created.   SQL> INSERT INTO t VALUES(1,'lijie');   1 ROW created.   SQL> ALTER TABLE t ADD constraints pk_t_a PRIMARY KEY(a);   TABLE altered.   SQL> SELECT constraint_name,constraint_type,STATUS FROM user_constraints WHERE TABLE_NAME='T';   CONSTRAINT_NAME C STATUS ------------------------------ - -------- PK_T_A P ENABLED   SQL> SELECT index_name,uniqueness FROM user_indexes WHERE TABLE_NAME='T';   INDEX_NAME UNIQUENES ------------------------------ --------- PK_T_A UNIQUE   SQL> ALTER TABLE t disable constraints pk_t_a;   TABLE altered.   SQL> SELECT constraint_name,constraint_type,STATUS FROM user_constraints WHERE TABLE_NAME='T';   CONSTRAINT_NAME C STATUS ------------------------------ - -------- PK_T_A P DISABLED SQL> SELECT index_name,uniqueness FROM user_indexes WHERE TABLE_NAME='T';   no ROWS selected   SQL> INSERT INTO t VALUES(1,'tina');   1 ROW created.   SQL> ALTER TABLE t enable novalidate constraints pk_t_a; ALTER TABLE t enable novalidate constraints pk_t_a * ERROR at line 1: ORA-02437: cannot validate (TAOBAO.PK_T_A) - PRIMARY KEY violated

这里问题是:primary key所依赖的唯一键索引起的.

解决方法:

SQL> CREATE TABLE t2 AS (SELECT * FROM t WHERE 1=0);   TABLE created.   SQL> CREATE INDEX ind_t2_a ON t2(a);   INDEX created.   SQL> INSERT INTO t2 VALUES(1,'lijie');   1 ROW created.   SQL> ALTER TABLE t2 ADD constraints pk_t2_a PRIMARY KEY(a);   TABLE altered.   SQL> SELECT constraint_name,constraint_type,STATUS FROM user_constraints WHERE TABLE_NAME='T2';   CONSTRAINT_NAME C STATUS ------------------------------ - -------- PK_T2_A P ENABLED   SQL> SELECT index_name,uniqueness FROM user_indexes WHERE TABLE_NAME='T2';   INDEX_NAME UNIQUENES ------------------------------ --------- IND_T2_A NONUNIQUE   SQL> ALTER TABLE t2 disable constraints pk_t2_a;   TABLE altered.   SQL> SELECT constraint_name,constraint_type,STATUS FROM user_constraints WHERE TABLE_NAME='T2';   CONSTRAINT_NAME C STATUS ------------------------------ - -------- PK_T2_A P DISABLED   SQL> SELECT index_name,uniqueness FROM user_indexes WHERE TABLE_NAME='T2';   INDEX_NAME UNIQUENES ------------------------------ --------- IND_T2_A NONUNIQUE   SQL> INSERT INTO t2 VALUES(1,'tina');   1 ROW created.   SQL> ALTER TABLE t2 enable validate constraints pk_t2_a; ALTER TABLE t2 enable validate constraints pk_t2_a * ERROR at line 1: ORA-02437: cannot validate (TAOBAO.PK_T2_A) - PRIMARY KEY violated SQL> ALTER TABLE t2 enable novalidate constraints pk_t2_a;   TABLE altered.

 

One Response to “关于约束ENABLE NOVALIDATE的一个疑问”

转载于:https://www.cnblogs.com/seasonzone/p/4229164.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值