oracle非延迟约束,Oracle可延迟约束Deferable的使用
标准规定,约束可以是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的使用相关推荐
- oracle非共享式,Oracle专用模式(DEDICATED)和 共享模式(SHARE)
专用服务器(DEDICATED):一个客户端连接对应一个服务器进程,适合批处理和大任务的应用 共享服务器(SHARE):多个客户端连接对应一个服务器进程,服务器端存在一个进程调度器来管理.它必须使用n ...
- Oracle数据库:约束条件:主键约束、唯一约束、检查约束、非空约束、外键约束、默认值填写
Oracle数据库:约束条件:主键约束.唯一约束.检查约束.非空约束.外键约束.默认值填写 2022找工作是学历.能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开 ...
- oracle如何添加非空约束,oracle 怎么用sql删除非空约束?
最近在学习oracle的闪回知识(oracle11g),也注意到了这个问题,经初步测试是结果是这样的: 首先确认一下,数据库是否打开了闪回特性: show parameter recyclebin; ...
- oracle银行卡号检查约束,oracle约束学习(1)unique和check
有人说,没有索引, 拿什么来保证约束?姑且不论这话的对错,但约束的实现(除了not null),很多都是通过索引来快速定位约束的地方.unique约束会自动建立索引,pk也是.也因此,约束的很多问题总 ...
- 默认约束 oracle,ORACLE约束(constraint):对象的强制规定
ORACLE约束(constraint):对象的强制规定 5种约束: NOT NULL 非空 NN UNIQUE 唯一 UK PRIMARY KEY 主键 PK FOREIGN ...
- oracle 怎么创建约束,Oracle创建约束
约束的类型: oracle数据库支持的约束类型包括: 1.unique 2.not null 3.primary key 4.foreignkey 5.check 约束都有名称.如果没有显示地给它们命 ...
- Oracle视图添加约束,Oracle创建视图的语法
Oracle创建视图的语法 导读:就爱阅读网友为大家分享了多篇关于 "oracle 创建序列语法" 资料,内容精辟独到,非常感谢网友的分享,希望从中能找到对您有所帮助的内容. 相关 ...
- oracle建表6大约束,oracle 建表 约束 constraint
约束命名规则 如果不指定约束名Oracle server 自动按照SYS_Cn 的格式指定约束名,也可手动指定, 推荐的约束命名是:约束类型_表名_列名. NN:NOT NULL ...
- linux音源管理 二维表,Oracle【二维表管理:约束】
1.简单的表创建和字段类型 最简单的方式去创建表(没有添加主键之类的约束条件) [Oracle的字段类型] number:数值类型 --整数类型:number(a) 总长度a --小数类型:numbe ...
最新文章
- 浅谈Android五大布局——LinearLayout、FrameLayout和AbsoulteLa
- 第四天2017/03/31(上午:指针、数组的小知识)
- [Azure] Notification Hubs注册模式
- DM***+OSPF测试
- 总奖池2.5万美元,Kaggle 新赛,单细胞分类与分割
- 2021年内衣品牌营销传播方案-婧麒+美柚.pdf(附下载链接)
- SQL Pass北京举办第六次线下活动,欢迎报名
- css实现垂直居中6种方法
- 什么软件可以测试电脑显示器坏点,怎么检测液晶显示器亮点、暗点、坏点
- springboot xml转json工具类
- ajax 灯箱效果,灯箱效果插件Magnific Popup详解
- 数据可视化:基本图表
- mac mini 开发android,Mac mini M1上成功启动Ubuntu
- 利用Django创建简单app
- 用四阶RungeKutta方程解二阶常微分方程,并计算船舶在规则波中的横摇角(附Matlab代码)
- IDEA部署Java项目时HTML,CSS等静态资源在网页上显示有问题的解决办法
- requests使用socks代理
- 数学的Math类总结,方便自己使用,有正余切和一些双曲函数
- 华为首超苹果,iPhone 风光已不再?百度资讯搜索来源调整;自动驾驶激光雷达厂商Velodyne筹备上市;...
- python实现删除重复文件
热门文章
- opencv之使用floodfill填充孔洞
- linux resin mysql_【转】Linux下Resin+JSP+MySQL的安装和配置
- IOS 状态栏 显示与隐藏网络活动状态
- System Information Viewer系统信息、硬件规格检测器
- typora工具的使用方法-一款非常适合程序员的工具
- 用“小红的下任男友是谁”通俗解释强化学习中的 基于模型方法 与 免模型方法
- 算法练习——聪明的情侣
- EDA实验课课程笔记(六)——NC-verilog的介绍与使用(二)
- C++使用boost::bind 订阅消息中的返回函数传入多个参数
- 翁恺java答案第五周_[JAVA]翁恺老师零基础学java语言第五周素数例题中continue的困惑...