完整性约束的状态

完整性约束的状态

在前面介绍了为了维护数据的完整性,可能会在一个表上定义一个或多个完整性约束。但是Oracle系统进行过多的约束检查会大大地降低效率。在某些情况下,例如在数据仓库系统中大规模装入数据时,为了系统的效率可能不得不牺牲数据的完整性来关闭(禁止)一些约束。任何一个完整性约束都可能处在下面的4种状态之一。

DISABLENOVALIDATE(禁止而无效):不做任何约束所定义的检查。表中的数据以及输入或修改的数据都可能不遵守约束所定义的规则。

DISABLEVALIDATE(禁止而有效):表中由约束所限制的列不能做任何的修改。还有约束上的索引将被删除掉,而且约束也将被禁止(关闭)。

ENABLENOVALIDATE(激活而无效):新的违反约束的数据不能输入到表中。但是表中可能包含违反约束的数据。在将有效的联机事务处理系统数据装入到数据仓库时,这种状态可能很有用。

ENABLEVALIDATE(激活而有效):任何违反约束的数据行都不能插入到表中。不过可能有一些违反约束的数据行在约束被禁止期间已经插入了表中。这样的数据行被称为例外,它们必须或者被修改或者被删除。

 

当一个约束从禁止(disabled)状态变为ENABLEVALIDATE时,表中所有的数据都会被上锁以检验数据的完整性。这可能造成DML操作的等待,因此建议:为了系统的效率,在生产(商业)数据库系统上最好不要在繁忙期间将约束从禁止状态变为ENABLEVALIDATE。在繁忙期间可以先将约束从禁止状态变为ENABLENOVALIDATE状态,之后等系统平静下来,再将约束改为ENABLE VALIDATE状态。

 

Oracle完整性约束的各种状态之间的变化遵循以下的原则:

如果在激活(enable)约束时没有说明NOVALIDATE,就意味着ENABLE VALIDATE。

如果在禁止(disable)约束时没有说明VALIDATE,就意味着DISABLE NOVALIDATE。

如果唯一(unique)约束或主键(primarykey)约束从禁止(disable)状态变为激活(enable)状态时没有索引,Oracle系统就会自动地为之创建一个唯一索引。与此类似,如果唯一(unique)约束或主键(primarykey)约束从激活(enable)状态变为禁止(disable)状态时,其索引为唯一索引,Oracle系统将会自动地删除这一索引。

当任何一个约束从无效(novalidate)状态变为有效(validate)状态时,Oracle系统必须检查所有的数据。但是从有效(validate)状态变为无效(novalidate)状态时,Oracle系统将不进行数据的检查。

将一个约束从ENABLE NOVALIDATE状态变为ENABLEVALIDATE状态时,Oracle系统并不阻塞任何读、写操作及其他的DDL语句。

 

 

 

约束状态--约束一共有四种状态
a、enable validate-要求新旧数据必须同时满足约束规则-在规则正在进行中时是不容许在表上进行任何DML操作的
b、enable novalidate-已存在数据可以不满足,但是新数据必须满足
c、disablevalidate-不容许在表上进行任何DML操作,对主键和唯一约束来说,会删除相应的唯一索引,但约束规则仍然有效
d、disable novalidate-数据不满足约束规则,对主键和唯一约束来说,会删除相应的唯一索引
初始化立即执行  INITIALLY IMMEDIATE--在每条语句执行结束时检验约束
初始化延迟执行  INITIALLY deferred一直等到事务完成后(或者调用setconstraint immediate语句时)才检验约束
SQL> create table t( x int constraint check_x check ( x > 0 )deferrable initially immediate,
y int constraint check_y check ( y > 0 ) deferrable initiallydeferred ) SQL> insert into t values ( -1,1);
insert into t values ( -1,1);0ERROR at line 1: ORA-02290: checkconstraint (OPS$TKYTE.CHECK_X) violated
由于CHECK_X是可延迟但初始化为立即执行的约束,所以这一行立刻被拒绝了。而CHECK_Y则不同,它不仅是可延迟的,而且初始化为延迟执行,这就意味着直到我用COMMIT命令提交事务或将约束状态设置为立即执行时才检验约束。
SQL> insert into t values ( 1,-1);现在它是成功的(总之到目前为止是成功的)。我将约束检验延迟到了执行COMMIT的时候:
SQL> commit;
0ERROR at line 1: ORA-02091: transaction rolled back
ORA-02290: check constraint (OPS$TKYTE.CHECK_Y) violated
此时数据库将事务回滚,因为违反约束导致了COMMIT语句的失败。这些语句说明了初始化立即执行与初始化延迟执行约束之间的区别。initially(初始化)部分指定Oracle什么时候会进行默认的约束检验--是在语句结束时[immediate(立即执行)],还是在事务结束时[deferred(延迟执行)]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值