Oracle约束按约束状态又可分为disable novalidate,disable validate,enable novalidate,enable validate. 其中disable/enable代表是否启用约束,validate/novalidate代表启用约束时是否对表中原有数据作检查。
这里模拟生产环境中的情况,先建一张没有约束的表,等有一定数据后建立enable novalidate约束,进而执行enable validate来规范表中所有数据,具体如下:
1. 创建原始表及数据
SQL> create table t1(
2 id number,
3 name varchar2(20));
SQL> insert into t1 values(1,'A');
SQL> insert into t1 values(1,'B');
SQL> insert into t1 values(2,'C');
SQL> insert into t1 values(3,'D');
SQL> insert into t1 values(3,'E');
SQL> insert into t1 values(4,'F');
2. 在表上创建enable novalidate主键
SQL> alter table t1 add constraint pk_t1 primary key (id)
2 deferrable enable novalidate;
此时主键已经生效,但源表中包含不符合约束的数据
3. 尝试将约束状态更改为 enable validate,却发现原有数据有问题
SQL> alter table t1 enable validate constraint pk_t1;
alter table t1 enable validate constraint pk_t1
*
第 1 行出现错误:
ORA-02437: 无法验证 (SCOTT.PK_T1) - 违反主键
4. 找出违反约束的数据,删除后生效
参考:http://sns.linuxpk.com/space.php?uid=52196&do=blog&id=16032
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15720542/viewspace-622176/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15720542/viewspace-622176/
本文通过实例演示了Oracle数据库中约束的不同状态,包括disable novalidate、disable validate、enable novalidate及enable validate的区别。并展示了如何在已有数据的情况下添加主键约束,并解决约束冲突。
1074

被折叠的 条评论
为什么被折叠?



