免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1608 | 回复: 0
打印 上一主题 下一主题

Oracle基础 之 约束条件状态 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-23 03:38 |只看该作者 |倒序浏览

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP