oracle SET CONSTRAINT[S]
2014-03-27 22:10
204 查看
相关文档:http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10003.htm#SQLRF55303
语法:
set_constraints::=
先创建表:
创建约束:
插入数据,立刻就进行验证:
修改约束(先DROP后ADD):
此时如果不SET CONSTRAINT,直接执行INSERT,同样会报错:
现在SET CONSTRAINT:
再次INSERT:
但是COMMIT时会报错:
设置成IMMEDIATE:
然后INSERT:
如果约束不是DEFERRABLE:
那么设置DEFERRED时会报错:
上面是指定了约束名CONS_ACID,现在不指定,用ALL:
还可以参考网友/article/3865048.html
默认情况下,Oracle constraint是不开启延迟约束和原有数据保留验证的。那么在什么样的场景下,我们可以考虑使用这些特性呢?
1、批量数据导入、物化视图刷新的时候,事务量很大,而且存在数据规律前后颠倒的情况。此时,如果开启着立即约束应用的开关,可能存在一些暂时性的约束不满足的情况,从而影响到整个系统的运行。开启约束延迟验证,就可以帮助我们解决这个问题;
2、历史数据移植。历史数据存在不规则的情况,很多时候难以满足我们新系统的数据完整性要求。可以使用not validate的方式,对历史数据不进行约束控制,而只针对新数据开启管理;
语法:
set_constraints::=
先创建表:
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)
还可以参考网友/article/3865048.html
默认情况下,Oracle constraint是不开启延迟约束和原有数据保留验证的。那么在什么样的场景下,我们可以考虑使用这些特性呢?
1、批量数据导入、物化视图刷新的时候,事务量很大,而且存在数据规律前后颠倒的情况。此时,如果开启着立即约束应用的开关,可能存在一些暂时性的约束不满足的情况,从而影响到整个系统的运行。开启约束延迟验证,就可以帮助我们解决这个问题;
2、历史数据移植。历史数据存在不规则的情况,很多时候难以满足我们新系统的数据完整性要求。可以使用not validate的方式,对历史数据不进行约束控制,而只针对新数据开启管理;
相关文章推荐
- oracle,Cannot SET AUTOTRACE解决问题
- sqlserver/oracle update set from 写法 .
- oracle sql*plus set &spool介绍(二)
- Oracle® Database Patch 19121551 - Database Patch Set Update 11.2.0.4.4 (Includes CPUOct2014) - 傲游云浏览
- ORACLE开启执行计划 set autotrace on
- Oracle之唯一性约束(UNIQUEConstraint)用法详解
- Oracle OEM 配置报错: No value was set for the parameter DBCONTROL_HTTP_PORT 解决方法
- duplicate 数据库 from backupset [oracle 11.2.0.3 + asm] => [oracle 11.2.0.3 + fs ]
- Oracle DBA之手动注册监听(listener) -- alter system set local_listener="T02";
- 关于navicat连接oracle错误:ora-123737:instant client light:unsupported server character set zhs16gbk
- 安装Oracle Grid Infrastructure Patch Set Update(GI PSU)的主要步骤
- Oracle 11g RAC INS-06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
- Oracle约束(Constraint)详解
- Oracle 11g RAC INS-06006 Passwordless SSH connectivity not set up between the following node(s)
- 进去到oracle的bin目录下,运行./sqlplus报错,You may need to set ORACLE_HOME to your Oracle software directory
- ORACLE的SET命令
- Oracle参数设置教程之set和reset的实用案例
- oracle Set 命令介绍
- Oracle Aix下安装实例DISPLAY not set.错误解决 dbca
- Oracle constraint type