ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 测试Deferrable约束检查

测试Deferrable约束检查

原创 Linux操作系统 作者:hexiaomail 时间:2010-04-16 14:44:19 0 删除 编辑

约束条件检查
可以将约束条件的有效性检查延迟到事务处理结束时。 
非延迟约束条件又称即时约束条件,是在每个 DML 语句结束时强制执行的。违反约束条件会导致回退语句。如果约束条件导致诸如 delete cascade 等操作,则认为该操作是导致执行此操作的语句的一部分。定义为“非延迟”的约束条件不能更改为延迟约束条件。
 
延迟约束条件是提交事务处理时才检查的约束条件。如果在提交时检测到任何违反约束条件的情况,则会回退整个事务处理。当同时输入外键关系中的父行和子行(如订单录入系统中,这种情况下需要同时录入订单及订单项)时,这些约束条件非常有用。
按下列一种方式可指定将约束条件定义为“延迟”:
“立即开始”,指定在默认情况下,约束条件必须用作即时约束条件,除非另外显式进行了设置。
“延迟开始”,指定在默认情况下,只在事务处理结束时强制使用约束条件。

Deferrable“定义为可延迟(deferrable)”的约束可以指定为:
1. initially immediate(初始化立即执行):在每条语句执行结束时检验约束。
2. initially deferred(初始化延迟执行):直等到事务完成后(或者调用set constraint immediate语句时)才检验约束。

测试代码:
1、创建测试表,并正常插入一个数据。
SQL> create table txx1
  2  (
  3  x int
  4  constraint check_x check( x > 0 )
  5  deferrable initially deferred,
  6  y int
  7  constraint check_y check( y > 0 )
  8  deferrable initially immediate
  9  );

Table created.

SQL> insert into txx1
  2  values ( 1 , 1 );

1 row created.


2、当插入一个违反check_x约束的值时,它会延迟执行检查,直到commit;
SQL> insert into txx1
  2  values ( -2 , 2 );

1 row created.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (MYUSER.CHECK_X) violated

3、当插入一个违反check_y约束的值时,则会立刻检查;
SQL> insert into txx1
  2  values ( 3 , -2 );
insert into txx1
*
ERROR at line 1:
ORA-02290: check constraint (MYUSER.CHECK_Y) violated


4、设定set constraints all deferred,所有约束延迟检查;
SQL> set constraints all deferred;

Constraint set.

SQL> insert into txx1
  2  values ( 3 , -2 );

1 row created.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02290: check constraint (MYUSER.CHECK_Y) violated


4、设定set constraints all immediate,所有约束立刻执行检查;
SQL> set constraints all immediate;

Constraint set.

SQL> insert into txx1
  2  values ( -3, 2);
insert into txx1
*
ERROR at line 1:
ORA-02290: check constraint (MYUSER.CHECK_X) violated


它的主要用处:
主要用于物化视图(快照)。这些视图会使用延迟约束来进行视图刷新。在刷新物化视图的过程中,可能会破坏完整性,而且将不能逐句检验约束。但到执行COMMIT时,数据完整性就没问题了,而且能满足约束。没有延迟约束,物化视图的约束可能会使刷新过程不能成功进行。
使用延迟约束的另一个普遍原因是,当预测是否需要更新父/子关系中的主键时,它有助于级联更新。如果你将外键设为可延迟、但初始化为立即执行,那么你就可以将所有约束设置为可延迟。将父键更新为一个新值--至此子关系的完整性约束不会被验证。将子外键更新为这个新值。
COMMIT:只要所有受更新影响的子记录都指向现有的父记录,这条命令就能成功执行。
此外,你可以在各种多语句事务中使用延迟约束,这些事务在处理的过程中需要暂时破坏完整性,但最后它们都会物归原样。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9932141/viewspace-659932/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: EM重新配置问题
请登录后发表评论 登录
全部评论

注册时间:2008-07-05

  • 博文量
    86
  • 访问量
    219972