标准规定,约束可以是deferrable或not deferrable(默认)。

not deferrable 约束在每一个DML语句后检查;

deferrable 约束可以在每一个insert,delete,或update(即时模式)后立即检查,或者在事务末尾检查(延迟模式)

当没有按特定顺序执行数据加载时,这项功能特别有用——它允许先把数据载入子表,然后再装入父表。

另一种用法是在加载不符合某个check约束的数据之后,对其进行适当的更新。

语法如下:

[ [not] deferrable [initially {immediate | deferred} ] ]

[ [initially {immediate | deferred} ] [not] deferrable ]

1deferrable介绍

1.1deferrable的两个选项区别

deferrable表示该约束是可延迟验证的.它有两个选项:

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

Initially deferred:延迟验证,当事务提交时或调用set constraint[s] immediate语句时才验证.

区别是:事务提交时验证不通过,则立即回滚事务; set constraint[s] immediate时只验证,不回滚事务.

1.2notdeferrable与deferrable区别

区别就在于: “立即验证的可延迟约束”是可以根据需要设置成“延迟验证的可延迟约束”的,而“不可延迟验证”是不能改变的.

2deferrable实例

2.1建表

createtabletest1(anumber(1)constraintcheck_acheck(a >0)deferrable

initiallyimmediate,

bnumber(1)constraintcheck_bcheck(b >0)deferrable

initiallydeferred);

2.2正常插入,没问题

SQL> insert into test1 values(1, 1);

1 row inserted

2.3检验立即验证:数据不能插入

SQL> insert into test1 values(-1, 1);

insert into test1 values(-1, 1)

ORA-02290:违反检查约束条件(MYHR.CHECK_A)

2.4检验延迟验证:可以执行

SQL> insert into test1 values(1, -1);

1 row inserted

SQL> select * from test1;

A  B

-- --

1  1

1 -1

2.5提交延迟验证(commit):验证失败,自动回滚

SQL> commit;

commit

ORA-02091:事务处理已回退

ORA-02290:违反检查约束条件(MYHR.CHECK_B)

2.6提交延迟验证(set constraint immediate):验证失败,不回滚

SQL> insert into test1 values(1, -1);

1 row inserted

SQL> set constraint check_b immediate;

set constraint check_b immediate

ORA-02290:违反检查约束条件(MYHR.CHECK_B)

或者将所有的约束做修改: alter sessionset constraints = immediate;

或者:set constraints all immediate;

2.7将延迟验证设置为立即验证:则在插入时出错

SQL> set constraint check_b immediate;

Constraints set

SQL> insert into test1 values(1,-1);

insert into test1 values(1,-1)

ORA-02290:违反检查约束条件(MYHR.CHECK_B)

3deferrable用途

3.1物化视图

物化视图(快照),这是它的主要用途。这些视图会使用延迟约束来进行视图刷新。在刷新物化视图的过程中,可能会破坏完整性,而且将不能逐句检验约束。但到执行COMMIT时,数据完整性就没问题了,而且能满足约束。没有延迟约束,物化视图的约束可能会使刷新过程不能成功进行。

3.2级联更新

当预测是否需要更新父/子关系中的主键时,它有助于级联更新。看一下实际的例子:

SQL> create table t(tno number(10) constraint pk_t_tno primary key, tname varchar2(20));

SQL> create table s(sno number(10) constraint pk_s_tno primary key, sname varchar2(20), tno number(10));

SQL> alter table s add constraint fk_s_tno foreign key (tno) references t(tno);

SQL> insert into t values(1,'yuechaotian');

SQL> insert into t values(2,'tianyuechao');

SQL> commit;

SQL> insert into s values(1,'stu_1', 1);

SQL> insert into s values(2,'stu_2', 1);

SQL> commit;

SQL> update t set tno=22 where tno=2;

SQL> update t set tno=11 where tno=1;

update t set tno=11 where tno=1

ORA-02292:违反完整约束条件(MYHR.FK_S_TNO) -已找到子记录

SQL> select * from t;

TNO TNAME

----------- --------------------

1 yuechaotian

22 tianyuechao

SQL> select *from s;

SNO SNAME                        TNO

----------- -------------------- -----------

1 stu_1                          1

2 stu_2                          1

SQL> rollback;

SQL> alter table s drop constraint fk_s_tno;

SQL> alter table s add constraint fk_s_tno foreign key (tno) references t(tno) deferrable initially immediate;

SQL> select * from t;

TNO TNAME

----------- --------------------

1 yuechaotian

2 tianyuechao

SQL> select * from s;

SNO SNAME                        TNO

----------- -------------------- -----------

1 stu_1                          1

2 stu_2                          1

SQL> set constraint fk_s_tno deferred;

Constraints set

SQL> update t set tno=22 where tno=2;

SQL> update t set tno=11 where tno=1;

SQL> update s set tno = 11 where tno = 1;

SQL> commit;

SQL> select * from t;

TNO TNAME

----------- --------------------

11 yuechaotian

22 tianyuechao

SQL> select * from s;

SNO SNAME                        TNO

----------- -------------------- -----------

1 stu_1                         11

2 stu_2                         11

SQL> select a.constraint_name, a.deferrable, a.deferred from user_constraints a where a.constraint_name like '%TNO%';

CONSTRAINT_NAME                DEFERRABLE     DEFERRED

------------------------------ -------------- ---------

FK_S_TNO                       DEFERRABLE     IMMEDIATE

PK_S_TNO                       NOT DEFERRABLE IMMEDIATE

PK_T_TNO                       NOT DEFERRABLE IMMEDIATE

oracle非延迟约束,Oracle可延迟约束Deferable的使用相关推荐

  1. oracle非共享式,Oracle专用模式(DEDICATED)和 共享模式(SHARE)

    专用服务器(DEDICATED):一个客户端连接对应一个服务器进程,适合批处理和大任务的应用 共享服务器(SHARE):多个客户端连接对应一个服务器进程,服务器端存在一个进程调度器来管理.它必须使用n ...

  2. Oracle数据库:约束条件:主键约束、唯一约束、检查约束、非空约束、外键约束、默认值填写

    Oracle数据库:约束条件:主键约束.唯一约束.检查约束.非空约束.外键约束.默认值填写 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开 ...

  3. oracle如何添加非空约束,oracle 怎么用sql删除非空约束?

    最近在学习oracle的闪回知识(oracle11g),也注意到了这个问题,经初步测试是结果是这样的: 首先确认一下,数据库是否打开了闪回特性: show parameter recyclebin; ...

  4. oracle银行卡号检查约束,oracle约束学习(1)unique和check

    有人说,没有索引, 拿什么来保证约束?姑且不论这话的对错,但约束的实现(除了not null),很多都是通过索引来快速定位约束的地方.unique约束会自动建立索引,pk也是.也因此,约束的很多问题总 ...

  5. 默认约束 oracle,ORACLE约束(constraint):对象的强制规定

    ORACLE约束(constraint):对象的强制规定 5种约束: NOT NULL     非空 NN UNIQUE       唯一 UK PRIMARY KEY  主键 PK FOREIGN ...

  6. oracle 怎么创建约束,Oracle创建约束

    约束的类型: oracle数据库支持的约束类型包括: 1.unique 2.not null 3.primary key 4.foreignkey 5.check 约束都有名称.如果没有显示地给它们命 ...

  7. Oracle视图添加约束,Oracle创建视图的语法

    Oracle创建视图的语法 导读:就爱阅读网友为大家分享了多篇关于 "oracle 创建序列语法" 资料,内容精辟独到,非常感谢网友的分享,希望从中能找到对您有所帮助的内容. 相关 ...

  8. oracle建表6大约束,oracle 建表 约束 constraint

    约束命名规则 如果不指定约束名Oracle server 自动按照SYS_Cn 的格式指定约束名,也可手动指定, 推荐的约束命名是:约束类型_表名_列名. NN:NOT NULL           ...

  9. linux音源管理 二维表,Oracle【二维表管理:约束】

    1.简单的表创建和字段类型 最简单的方式去创建表(没有添加主键之类的约束条件) [Oracle的字段类型] number:数值类型 --整数类型:number(a) 总长度a --小数类型:numbe ...

最新文章

  1. 浅谈Android五大布局——LinearLayout、FrameLayout和AbsoulteLa
  2. 第四天2017/03/31(上午:指针、数组的小知识)
  3. [Azure] Notification Hubs注册模式
  4. DM***+OSPF测试
  5. 总奖池2.5万美元,Kaggle 新赛,单细胞分类与分割
  6. 2021年内衣品牌营销传播方案-婧麒+美柚.pdf(附下载链接)
  7. SQL Pass北京举办第六次线下活动,欢迎报名
  8. css实现垂直居中6种方法
  9. 什么软件可以测试电脑显示器坏点,怎么检测液晶显示器亮点、暗点、坏点
  10. springboot xml转json工具类
  11. ajax 灯箱效果,灯箱效果插件Magnific Popup详解
  12. 数据可视化:基本图表
  13. mac mini 开发android,Mac mini M1上成功启动Ubuntu
  14. 利用Django创建简单app
  15. 用四阶RungeKutta方程解二阶常微分方程,并计算船舶在规则波中的横摇角(附Matlab代码)
  16. IDEA部署Java项目时HTML,CSS等静态资源在网页上显示有问题的解决办法
  17. requests使用socks代理
  18. 数学的Math类总结,方便自己使用,有正余切和一些双曲函数
  19. 华为首超苹果,iPhone 风光已不再?百度资讯搜索来源调整;自动驾驶激光雷达厂商Velodyne筹备上市;...
  20. python实现删除重复文件

热门文章

  1. opencv之使用floodfill填充孔洞
  2. linux resin mysql_【转】Linux下Resin+JSP+MySQL的安装和配置
  3. IOS 状态栏 显示与隐藏网络活动状态
  4. System Information Viewer系统信息、硬件规格检测器
  5. typora工具的使用方法-一款非常适合程序员的工具
  6. 用“小红的下任男友是谁”通俗解释强化学习中的 基于模型方法 与 免模型方法
  7. 算法练习——聪明的情侣
  8. EDA实验课课程笔记(六)——NC-verilog的介绍与使用(二)
  9. C++使用boost::bind 订阅消息中的返回函数传入多个参数
  10. 翁恺java答案第五周_[JAVA]翁恺老师零基础学java语言第五周素数例题中continue的困惑...