[20170512]延迟约束问题.txt

[20170512]延迟约束问题.txt

--//别人问的问题,通过例子来说明:

1.环境:
SCOTT@book> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

--//建立约束时可以deferrable initially immediate 或者 deferrable initially deferred.
--//还有一种NOT DEFERRABLE,这种跟deferrable initially immediate存在什么区别.

create table t
( a int constraint check_a check ( a > 0 ) deferrable initially immediate,
  b int constraint check_b check ( b > 0 ) deferrable initially deferred,
  c int constraint check_c check ( c > 0 ) deferrable,
  d int constraint check_d check ( d > 0 ) );

SCOTT@book> select constraint_name,deferrable,deferred from user_constraints  where table_name='T';
CONSTRAINT_NAME DEFERRABLE     DEFERRED
--------------- -------------- ---------
CHECK_A         DEFERRABLE     IMMEDIATE
CHECK_B         DEFERRABLE     DEFERRED
CHECK_C         DEFERRABLE     IMMEDIATE
CHECK_D         NOT DEFERRABLE IMMEDIATE

--//实际上其他都很好理解.就是对于字段A,D.两者情况都是立即起作用.也就是你不能这样插入数据,或者修改数据.

SCOTT@book> insert into t values (-1,2,3,4);
insert into t values (-1,2,3,4)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CHECK_A) violated

SCOTT@book> insert into t values (1,2,3,-4);
insert into t values (1,2,3,-4)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CHECK_D) violated

--//都是在dml时马上起作用.视乎两者没有什么区别.

2.实际上oracle还可以临时设置set constraints all deferred;或者set constraints all immediate;

SCOTT@book> set constraints all deferred;
Constraint set.

SCOTT@book> insert into t values (1,2,3,-4);
insert into t values (1,2,3,-4)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CHECK_D) violated

SCOTT@book> insert into t values (-1,2,3,4);
1 row created.

SCOTT@book> insert into t values (1,-2,3,4);
1 row created.

SCOTT@book> insert into t values (1,2,-3,4);
1 row created.

--//这样就可以看出两者的区别,设置set constraints all deferred;时仅仅对约束是DEFERRABLE有效.而对于约束NOT DEFERRABLE无效.
--//当然提交时不满足约束,肯定报错.

SCOTT@book> commit ;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (SCOTT.CHECK_A) violated

--//临时修改set constraints all immediate;
SCOTT@book> set constraints all immediate;
Constraint set.

SCOTT@book> insert into t values (-1,2,3,4);
insert into t values (-1,2,3,4)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CHECK_A) violated

SCOTT@book> insert into t values (1,-2,3,4);
insert into t values (1,-2,3,4)
*
ERROR at line 1:
ORA-02290: check constraint (SCOTT.CHECK_B) violated

--//字段B插入负数也马上报错.

时间: 2024-07-30 10:50:12

[20170512]延迟约束问题.txt的相关文章

[20160719]主外键与延迟约束2.txt

[20160719]主外键与延迟约束2.txt --前几天遇到的问题,因为开发没有在2个存在主外键上的表上建立约束,导致主表记录删除了,而外表数据还在. --主要开发有需求要删除主表的记录,由于条件写错,导致以上情况出现.实际上oracle支持延迟约束,只有提交的时候才会检查. --自己通过例子说明: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ---------------

[20160716]主外键与延迟约束.txt

[20160716]主外键与延迟约束.txt --前几天遇到的问题,因为开发没有在2个存在主外键上的表上建立约束,导致主表记录删除了,而外表数据还在. --主要开发有需求要删除主表的记录,由于条件写错,导致以上情况出现.实际上oracle支持延迟约束,只有提交的时候才会检查. --自己通过例子说明: 1.环境: SCOTT@test01p> @ ver1 PORT_STRING           VERSION    BANNER                                

OCP1z0-047 : 约束―――延迟约束

这题是考延迟约束的相关知识点.在表CUST设了主键cust_id(唯一并且非空),在主键设延迟约束,所谓延迟约束就是在dml时数据库不判断数据是否满足约束,在commit时来判断,如果commit,做dml操作时(这道题是插入的数据如果不满足约束条件那就会做rollback) 这道题中,第一行,第二行数据的cust_id都为1,重复了,在提交时肯定会报错,结果会回滚.相当于第一行,第二行不会插入到表CUST中. 第三行,第四行的cust_id分别为1和2,没有重复,提交时插入成功,会永久保存.

[20170516]nvl与非NULL约束2.txt

[20170516]nvl与非NULL约束2.txt --//接着上午的测试看看COALESCE看看过滤的情况. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ----------------------------------------------------------------

[20150910]11G ADG与延迟日志应用.txt

[20150910]11G ADG与延迟日志应用.txt --11G ADG是一个非常好的特性,它可以一边应用日志,一边提供查询,前一阵子跟别人讨论ADG 是否可以与延迟日志应用结合起来,既 --提供只读查询,又延迟日志应用,自己从来没有测试过,今天测试看看. --实际上一种可能就是在dg上打开flashback,这样在出现问题时闪回到出问题的时间点.但是这个是回滚,而我延迟应用是前进. 1.测试环境: SCOTT@test> @ver BANNER ----------------------

[20150409]只读表空间与延迟块清除.txt

[20150409]只读表空间与延迟块清除.txt --昨天测试只读表空间的数据库恢复问题,突然想到一种情况,如果只读表空间存在延迟块清除情况,这样在下次访问是会更新块的信息吗? --自己还是做1个测试: 1.首先在测试前,说明1点,设置表空间只读,仅仅阻止dml操作,并不能阻止ddl操作,ddl操作的是数据字典. SCOTT@test> @ &r/ver1 PORT_STRING                    VERSION        BANNER --------------

[20170420]关于延迟块清除3.txt

[20170420]关于延迟块清除3.txt --昨天做延迟块清除测试时,有一个问题我自己一直没搞明白,就是把表空间设置为只读的情况下,当访问块时, --由于没法更新对应块,不知道为什么每次重启数据库,正常undo的事务槽不可能这么块覆盖,为什么ora_rowscn --总是变化,而且取的是control scn,要认真探究一下问题在那里. --上午测试没有测试出来,链接http://blog.itpub.net/267265/viewspace-2137714/ => [20170420]关于

[20170816]Join Elimination Bug.txt

[20170816]Join Elimination Bug.txt https://jonathanlewis.wordpress.com/2017/08/14/join-elimination-bug/ --//自己重复测试1次. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- ---

Oracle外键约束修改行为(一)描述Oracle外键处理默认操作

Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 在SQL92标准中定义了几种外键改变后,如何处理子表记录的动作,其中包括: 限制Restrict:这种方式不允许对被参考的记录的键值执行更新或删除的操作: 置为空Set to null:当参考的数据被更新或者删除,那么所有参考它的外键值被置为空: 置为默认值Set to default:当参考的数据被更新或者删除,那么所有参考它的外键值被置为一个默认