oracle SET CONSTRAINT[S]

相关文档:http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10003.htm#SQLRF55303


语法:

set_constraints::=

Description of set_constraints.gif follows


先创建表:

SQL> CREATE TABLE TB_CONS (ID INTEGER);

表已创建。

创建约束:

SQL> ALTER TABLE TB_CONS ADD CONSTRAINT CONS_ACID CHECK (ID > 5);

表已更改。

插入数据,立刻就进行验证:

SQL> INSERT INTO TB_CONS VALUES (6);

已创建 1 行。

SQL> INSERT INTO TB_CONS VALUES (3);
INSERT INTO TB_CONS VALUES (3)
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (HIBERNATE.CONS_ACID)


SQL>

修改约束(先DROP后ADD):

SQL> ALTER TABLE TB_CONS DROP CONSTRAINT CONS_ACID;

表已更改。

SQL> ALTER TABLE TB_CONS ADD CONSTRAINT CONS_ACID CHECK (ID > 5) DEFERRABLE;

表已更改。

此时如果不SET CONSTRAINT,直接执行INSERT,同样会报错:

SQL> INSERT INTO TB_CONS VALUES (3);
INSERT INTO TB_CONS VALUES (3)
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (HIBERNATE.CONS_ACID)

现在SET CONSTRAINT:

SQL> SET CONSTRAINTS CONS_ACID DEFERRED;

约束条件已设置。

再次INSERT:

SQL> INSERT INTO TB_CONS VALUES (3);

已创建 1 行。

但是COMMIT时会报错:

SQL> COMMIT;
COMMIT
*
第 1 行出现错误:
ORA-02091: 事务处理已回退
ORA-02290: 违反检查约束条件 (HIBERNATE.CONS_ACID)


设置成IMMEDIATE:

SQL> SET CONSTRAINTS CONS_ACID IMMEDIATE;

约束条件已设置。

然后INSERT:

SQL> INSERT INTO TB_CONS VALUES (3);
INSERT INTO TB_CONS VALUES (3)
*
第 1 行出现错误:
ORA-02290: 违反检查约束条件 (HIBERNATE.CONS_ACID)

如果约束不是DEFERRABLE:

SQL> ALTER TABLE TB_CONS DROP CONSTRAINT CONS_ACID;

表已更改。

SQL> ALTER TABLE TB_CONS ADD CONSTRAINT CONS_ACID CHECK (ID > 5);

表已更改。

那么设置DEFERRED时会报错:

SQL> SET CONSTRAINTS CONS_ACID DEFERRED;
SET CONSTRAINTS CONS_ACID DEFERRED
*
第 1 行出现错误:
ORA-02447: 无法延迟不可延迟的约束条件

上面是指定了约束名CONS_ACID,现在不指定,用ALL:

SQL> SET CONSTRAINTS ALL DEFERRED;

约束条件已设置。

SQL> INSERT INTO TB_CONS VALUES (3);

已创建 1 行。

SQL> COMMIT;
COMMIT
*
第 1 行出现错误:
ORA-02091: 事务处理已回退
ORA-02290: 违反检查约束条件 (HIBERNATE.CONS_ACID)


还可以参考网友http://blackproof.iteye.com/blog/1675498


默认情况下,Oracle constraint是不开启延迟约束和原有数据保留验证的。那么在什么样的场景下,我们可以考虑使用这些特性呢?
 
1、批量数据导入、物化视图刷新的时候,事务量很大,而且存在数据规律前后颠倒的情况。此时,如果开启着立即约束应用的开关,可能存在一些暂时性的约束不满足的情况,从而影响到整个系统的运行。开启约束延迟验证,就可以帮助我们解决这个问题;
2、历史数据移植。历史数据存在不规则的情况,很多时候难以满足我们新系统的数据完整性要求。可以使用not validate的方式,对历史数据不进行约束控制,而只针对新数据开启管理;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值