数据库中三大问题约束、CASE语句和文件(上)

 

本文用实例方式讲述了关于约束、CASE语句和文件三大问题。

约束

“定义为可延迟(deferrable)”的约束可以指定为:

 

1. initially immediate(初始化立即执行)或

2. initially deferred(初始化延迟执行)。

 

知道什么是延迟约束,但不明白什么叫“初始化立即执行的可延迟约束”和“初始化延迟执行的可延迟约束”。请解释二者的区别。还有,这些约束有什么用途?这是通常容易混淆的问题。我希望下面的例子能解释清楚。初始化立即执行/延迟执行规定了在默认情况下应该如何执行约束:

 

初始化立即执行:在每条语句执行结束时检验约束。

 

初始化延迟执行:直等到事务完成后(或者调用set constraint immediate语句时)才检验约束。

 

通过代码分析两者不同:

 

       
       SQL> create table t
2 ( x int constraint
check_x check ( x > 0 )
deferrable
initially immediate,
3y int constraint
check_y check ( y > 0 )
deferrable
initially deferred
4 )
5 /
Table created.

SQL> insert into t values ( 1,1 );
1 row created.

SQL> commit;
Commit complete.

 

所以,当两个约束同时满足时才能正确无误地插入行。但是,如果我试图插入违反CHECK_X约束(初始化立即执行的约束)的行,则系统会立即检验约束,并得到下面的结果:

 

       
       SQL> insert into t values ( -1,1);
insert into t values ( -1,1)
*
ERROR at line 1:
ORA-02290: check constraint
(OPS$TKYTE.CHECK_X) violated

由于CHECK_X是可延迟但初始化为立即执行的约束,所以这一行立刻被拒绝了。而CHECK_Y则不同,它不仅是可延迟的,而且初始化为延迟执行,这就意味着直到我用COMMIT命令提交事务或将约束状态设置为立即执行时才检验约束。

 

       
       SQL> insert into t values ( 1,-1);
1 row created.

现在它是成功的(总之到目前为止是成功的)。我将约束检验延迟到了执行COMMIT的时候:

 

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

此时数据库将事务回滚,因为违反约束导致了COMMIT语句的失败。这些语句说明了初始化立即执行与初始化延迟执行约束之间的区别。initially(初始化)部分指定Oracle什么时候会进行默认的约束检验--是在语句结束时[immediate(立即执行)],还是在事务结束时[deferred(延迟执行)]。我还要说明deferred(可延迟)子句有什么用。我可以发出命令,让所有可延迟的约束变为延迟执行的。注意,你也可以对一个约束使用该命令;你不必让所有可延迟的约束都变为延迟执行的:

 

       
       SQL> set constraints all deferred;
Constraint set.

SQL> insert into t values ( -1,1);
1 row created.

 

由于将初始化立即执行的约束设置为延迟执行的模式,这个语句似乎执行成功;但是,当我用COMMIT语句提交事务时,看一下会发生什么:

 

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

 

事务提交失败并回滚,因为在COMMIT语句之后对约束进行了检验。相反,我可以将初始化为延迟执行的约束变为“立即”执行的约束:

 

       
       SQL> set constraints all immediate;
Constraint set.

SQL> insert into t values ( 1,-1);
insert into t values ( 1,-1)
*
ERROR at line 1:
ORA-02290: check constraint
(OPS$TKYTE.CHECK_Y) violated

前面在我提交前能执行的语句现在立即出了问题。因为我手动修改了默认的约束模式。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值