Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1694682
  • 博文数量: 163
  • 博客积分: 10591
  • 博客等级: 上将
  • 技术积分: 1980
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-08 18:17
文章分类

全部博文(163)

文章存档

2018年(1)

2012年(1)

2011年(47)

2010年(58)

2009年(21)

2008年(35)

分类: Oracle

2011-10-23 15:51:15

Oracle 中为了更好地处理需要数据暂时违反约束条件的情况,可将约束条件指定为不同的状态。

主要的约束条件状态有以下几类:

? DISABLE NOVALIDATE
? DISABLE VALIDATE
? ENABLE NOVALIDATE
? ENABLE VALIDATE

这里的ENABLE/DISABLE的语义是:“启用 (ENABLE) 或禁用 (DISABLE) 完整性约束条件”。

如果启用约束条件,在数据库中输入或更新数据时就会检查数据。此时,禁止输入不符合约束条件规则的数据。如果禁用约束条件,则可以在数据库中输入不符合规则的数据。

所以可以理解ENABLE/DISABLE是对插入或修改的数据进行完整性约束条件检查的开关,主要针对新进入的数据;

 

VALIDATE/NOVALIDATE 主要针对现有数据的完整性约束检查;

 

下面通过小例子体会一下其中的差异:

SQL> create table test(id int,name varchar2(10)); Table created
SQL> alter table test add constraint ck_id check(id>10); Table altered

DISABLE NOVALIDATE :这个很简单,就是对现有的数据和新插入的数据都不做完整性约束检查;

SQL> alter table test disable novalidate constraint ck_id; Table altered   SQL> insert into test values(2,'2'); 1 row inserted
DISABLE VALIDATE :对新数据不做验证,对现有数据做完整性约束检查。这样会有什么后果呢?因为在验证现有数据后又允许将未经检查的数据输入表中,会出现不一致的情况。因此当条件状态设为这一条件时,实际的结果就是:不允许对受约束的列进行任何修改
SQL> alter table test disable validate constraint ck_id; alter table test disable validate constraint ck_id ORA-02293: 无法验证 (XIEKELI.CK_ID) - 违反检查约束条件 SQL> delete from test where id<10; 1 row deleted SQL> alter table test disable validate constraint ck_id; Table altered SQL> insert into test values(2,'2'); insert into test values(2,'2') ORA-25128: 不能对带有禁用和验证约束条件 (XIEKELI.CK_ID) 的表进行插入/更新/删除
看看有什么后果,首先对现有的数据进行约束检查,因为存在id=2的这条记录,所以提示“ORA-02293: 无法验证 (XIEKELI.CK_ID) - 违反检查约束条件”
将非法的记录删除后,约束条件状态设置成功,此时对表进行插入后提示“ORA-25128: 不能对带有禁用和验证约束条件 (XIEKELI.CK_ID) 的表进行插入/更新/删除”
ENABLE NOVALIDATE:对现有的数据不做约束检查,对新数据进行约束检查。在可以更正现有约束条件违规情况,同时又不允许将新的违规数据输入到系统中时,常常会使用此状态。
先加一条违反约束的记录:
SQL> alter table test disable novalidate constraint ck_id; Table altered SQL> insert into test values(2,'2'); 1 row inserted
设置约束条件状态后,看看:
SQL> alter table test enable novalidate constraint ck_id; Table altered SQL> insert into test values(3,'3'); insert into test values(3,'3') ORA-02290: 违反检查约束条件 (XIEKELI.CK_ID) SQL> insert into test values(13,'13'); 1 row inserted
 
没错,只对新数据进行了检查,原来加入到那条(2,‘2’),被忽略了。
 
ENABLE VALIDATE:新数据与现有数据均符合约束条件。这是约束条件的典型状态和默认状态。
 
通过这张图可能看得更清晰:
image
阅读(4944) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~