oracle设置约束条件_Oracle基础 之 约束条件状态

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 insertedDISABLE 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:新数据与现有数据均符合约束条件。这是约束条件的典型状态和默认状态。

通过这张图可能看得更清晰:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值