当前位置:   article > 正文

SQL之延迟约束

sql 触发器 延迟约束
在创建约束的时候,有2种选项  deffered(延迟约束),not deffered(不延迟约束,立即检验,这是默认的选项)
例如:
create table A(a int constraint check_a check(a>0),b int check check_b(b>0));
create table A(a int constraint check_a check(a>0) not deferrable,b int constraint check_b check(b>0) not deferrable);
--以上2种定义出来的表都是没有延迟约束的,也就是说,这是我们平时经常创建的表
--我们往A表插入数据
正常插入

不正常插入会立即报错

drop table A;
create table A(a int constraint check_a check(a>0) deferrable initially immediate,b int constraint check_b check(b>0) deferrable initially deferred);


对于有延迟约束的表,插入更新数据时,带有 deferrable initially immediate的选项时会立即检查约束,
带有deferrable initially deferred的选项时不会立即检查约束。

当使用commit提交事务时,这是会检查延迟约束,如果有违反约束的记录存在,则自动回滚事务
当使用 set contraint check_b immediate,也会检查延迟约束,但是不会自动回滚事务


延迟约束有什么用???
1.用于物化视图
用于每插入一条,或修改数据时并不立即检查约束,到提交事务时才检查约束。。。
2.用于更新级联
对于2个有主外键关系的表,更新时就有个麻烦
比如我有2张表,q1(教师id,姓名name )  q2(学生id,姓名,教师id ) 其中q2的教师id是一个外键

往q1,q2里插入一条数据

现在我想更改q1表中老师1的t_id号,但由于外键原因,由于在q2表中已经有了对该id的引用,所以 是改不了的

如果老师的id号确实写错了,但这2张表用了一段时间了,里面的数据比较多 ,该怎么办呢?
那么我们删除那个外键,重新建立一个延长约束外键


这样,我们先改q1表的教师id,然后再将q2表中对应的t_id 也改成一样,最后再提交时就不会违反外键的约束条件 了


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29227735/viewspace-1064119/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29227735/viewspace-1064119/

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/653114
推荐阅读
相关标签
  

闽ICP备14008679号