首先搞清下几个概念:Oracle中,约束分deferred 跟 immediate 2种:
deferred:如果 Oracle 在事务提交(commit)时才对约束执行检查,则称此约束是延迟的(deferred)。如果数据违反了延迟约束,提交操作将导致事务被回滚(undo)。
immediate:如果约束是即时的(immediate)(非延迟的),则此约束将在语句执行结束后进行检查。如果数据违反了延迟约束,语句将被立即回滚。一般情况下,我们用的约束初始都是immediate型的(默认),而且不好转为deferred型。但是如果初始是deferrable(需要手动指定),那deferred跟immediate 2种状态可以随意转换。
此外,约束有以下4种状态:
ENABLE(启用)确保所有输入的数据都遵从约束(constraint)
DISABLE(禁用)总是允许输入数据,无论数据是否遵从约束
VALIDATE(验证)确保已存在的数据遵从约束
NOVALIDATE(无验证)允许已存在的数据不遵从约束ENABLE VALIDATE 与 ENABLE 相同。Oracle 将检查约束,并保证所有数据均遵从约束。
ENABLE NOVALIDATE 表示所有新插入或被修改的数据都必须遵从约束,但允许已存在的数据不遵从约束。
DISABLE NOVALIDATE 与 DISABLE 相同。Oracle 不会检查约束.
DISABLE VALIDATE 将禁用约束,移除约束使用的索引,并禁止修改约束键的数据。约束不论哪种类型,要能够生效,必须状态是enable才行。--deferred 跟 immediate的对比试验-----------------------------
SQL> drop table aa purge;Table dropped.SQL> create table aa ( id number,name varchar2(20),constraint pk primary key(id));Table created.SQL> col constraint_name for a11
SQL> select CONSTRAINT_NAME ,CONSTRAINT_TYPE,TABLE_NAME ,STATUS,DEFERRABLE,DEFERRED,validated from u
ser_constraints where table_name="AA";CONSTRAINT_ C TABLE STATUS DEFERRABLE DEFERRED VALIDATED
----------- - ----- -------- -------------- --------- -------------
PK P AA ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED--可以看到,默认的是NOT DEFERRABLE,下面我们将它转为immediate试试SQL> set constraint pk immediate;
set constraint pk immediate
*
ERROR at line 1:
ORA-02447: cannot defer a constraint that is not deferrable--增加一个uk,指定deferrable initially immidiate|deferredSQL> alter table aa add constraint uk unique (name) deferrable initially immediate;Table altered.SQL> select CONSTRAINT_NAME ,CONSTRAINT_TYPE,TABLE_NAME ,STATUS,DEFERRABLE,DEFERRED,validated from u
ser_constraints where table_name="AA";CONSTRAINT_ C TABLE STATUS DEFERRABLE DEFERRED VALIDATED
----------- - ----- -------- -------------- --------- -------------
PK P AA ENABLED NOT DEFERRABLE IMMEDIATE VALIDATED
UK U AA ENABLED DEFERRABLE IMMEDIATE VALIDATEDSQL> select * from aa;no rows selectedSQL> insert into aa values(1,"SDF");1 row created.SQL> insert into aa values(2,"SDF");
insert into aa values(2,"SDF")
*
ERROR at line 1:
ORA-00001: unique constraint (LYN.UK) violated
SQL> set constraints uk deferred;Constraint set.SQL> select * from aa;no rows selectedSQL> insert into aa values(1,"SDF");1 row created.SQL> insert into aa values(2,"SDF");1 row created.SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-00001: unique constraint (LYN.UK) violated
Oracle deferrable选项RedHat AS5下Oracle 10g数据库安装笔记相关资讯 oracle
- [INS-32052] Oracle基目录和Oracle (07/22/2014 07:41:41)
- Oracle 4个大对象(lobs)数据类型 (02/03/2013 12:33:05)
- Oracle按时间段分组统计 (07/26/2012 10:36:48)
| - [Oracle] dbms_metadata.get_ddl的 (07/12/2013 07:37:30)
- Liferay Portal 配置使用Oracle和 (07/31/2012 20:07:18)
- Concurrent Request:Inactive (07/20/2012 07:44:05)
|
本文评论 查看全部评论 (1)
评论声明- 尊重网上道德,遵守中华人民共和国的各项有关法律法规
- 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
|