首页 > 数据库 > Oracle > [20190218]延迟约束问题2.txt
[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位)下测试结果也一样。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2636215/,如需转载,请注明出处,否则将追究法律责任。