上一篇 | 下一篇

关于约束、CASE语句和游标

发布: 2008-6-30 21:32 | 作者: admin | 来源: | 查看: 0次

关于约束、CASE语句和游标

【字体:小 大】

关于约束、CASE语句和游标

作者:- 文章来源:- 点击数:330 更新时间:2006-4-19

unknow

我们的技术专家谈完整性、时间和归属问题。

我仔细阅读了《Oracle9i 数据库概念手册(Oracle9i Database Concepts Manual)》和你们的站点,但对下述概念仍不明白:

"定义为可延迟(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,

3 y 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.

字号: | 推荐给好友

61/6123456>

评分:0

我来说两句