[20190218]延迟约束问题2.txt

来源:这里教程网 时间:2026-03-03 13:00:36 作者:

[20190218]延迟约束问题2.txt --//当时遇到的问题,链接如下: http://blog.itpub.net/267265/viewspace-2122166/ => [20160716]主外键与延迟约束.txt  http://blog.itpub.net/267265/viewspace-2122204/ => [20160719]主外键与延迟约束2.txt    --//其它例子: http://blog.itpub.net/267265/viewspace-2138946/ => [20170512]延迟约束问题.txt  --//当时因为开发没有在2个存在主外键上的表上建立约束,导致主表记录删除了,而外表数据还在. --//主要问题在于开发有需求要删除主表的记录,由于条件写错,导致出现以上情况. --//实际上oracle支持延迟约束,只有提交的时候才会检查。 我当时也很无奈,明显开发写代码有问题 --//什么能选择删除主记录,然后再插入回去这样的编程方式。 --//实际上查找这个问题就花了整整一天时间,确定恢复时间又花不少时间,恢复数据库到特定时间点又是一天。 --//更加严重事后根本没有总结,更谈不上更正编程方式。 --//实际上使用延迟约束,我个人认为更使用触发器一样,都不是很好的编程模式,再通过一个说明问题: 1.环境: SCOTT@book> @ ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------------------------------------------------------------------- x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production create table t(id number); alter table t add constraint pk_t primary key (id) deferrable initially deferred ; insert into t values (1); insert into t values (2); commit ; 2.测试: --//session 1: SCOTT@book(274,5)> insert into t values (1); 1 row created. SCOTT@book(274,5)> commit ; commit * ERROR at line 1: ORA-02091: transaction rolled back ORA-00001: unique constraint (SCOTT.PK_T) violated --//插入没有问题,但是提交会报错。因为违反唯一性约束,这时延迟约束的特点.继续测试: --//session 1: SCOTT@book(274,5)> update t set id=3 where id=2; 1 row updated. --//session 2: SCOTT@book(41,19)> update t set id=3 where id<=2; --//挂起!!因为修改都包括id=2的记录. --//session 1: SCOTT@book(274,5)> commit ; Commit complete. --//session 2: SCOTT@book(41,19)> update t set id=3 where id<=2; 1 row updated. --//注意仅仅修改1条。 SCOTT@book(41,19)> commit ; Commit complete. SCOTT@book(41,19)> select * from t;         ID ----------          3          3 --//破坏了唯一性约束. --//在12.2.0.2(for windows 64位)下测试结果也一样。

相关推荐