ITPub博客

首页 > 数据库 > Oracle > SQL之延迟约束

SQL之延迟约束

原创 Oracle 作者:RAYSUNNNY 时间:2013-12-24 12:40:19 0 删除 编辑
在创建约束的时候,有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博客 ” ,链接:https://blog.itpub.net/29227735/viewspace-1064119/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2013-12-05

  • 博文量
    38
  • 访问量
    242782