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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值