【Oracle】【延迟约束】功能

xixuefeng Oracle, SQL&Function 2012-09-14 23:00:14 1,109 次浏览 【Oracle】【延迟约束】功能已关闭评论

一:延迟约束有两个选项:

1)Initially immediate(默认): 立即验证, 执行完一个sql后就进行验证;

2)Initially deferred: 延迟验证, 当事务提交时或调用set constraint[s],事务提交时如果验证不通过,那么立即回滚事务。当调用set constraint[s] immediate时如果验证不通过,不回滚事务,只做验证操作

注意:

调用set constraint[s] immediate/deferred时,如果一个事务结束,那么set则失效,如果想让某个会话所有的延迟约束都改为立即验证(延迟验证),那么可以采取下面的方式:

alter session set constraints = immediate;

alter session set constraints = deferred;

二:延迟约束测试
1)建表
2)利用a、b字段的约束,验证延迟

3)利用a字段的约束,验证set constraint[s] deferred

4)利用b字段的约束,验证set constraint[s] immediate


5)利用c、d字段的约束,验证NOT DEFERRABLE/DEFERRABLE的区别


通过上面的测试我们发现,DEFERRABLE字段表示是否可以延迟约束,当为NOT DEFERRABLE的时候,那么那个约束是没有办法改变它的延迟验证的。当为DEFERRABLE的时候,那么那个约束则可以修改为立即验证或者延迟验证。

 
小结:
这个功能可以利用在,比如主、外键插入数据的时候,先后顺序也许不固定,那么就可以采用延迟验证的方式,只要事务结束的那一刻,主外键符合约束的话,那么就不会报错。
回顶部