Oracle deferrable、immediate 约束

简介: oracle数据库中的所有约束默认情况下都是立即触发的,也就是说在语句运行结束后数据库会检查数据的一致性状态.其中not deferrable 与initially immediate是一样的,与deferrable initially immediate则不同。

oracle数据库中的所有约束默认情况下都是立即触发的,也就是说在语句运行结束后数据库会检查数据的一致性状态.

其中not deferrable 与initially immediate是一样的,与deferrable initially immediate则不同。后者允许将constraint再改为initially deferred, 前者不允许更改:
>create table test2 (f1 number(3) constraint fk references test(f1) initially immediate);
>alter table test2 modify constraint fk initially deferred;
alter table test2 modify constraint fk initially deferred
*
ERROR 位于第 1 行:
ORA-02447: 无法延迟不可延迟的约束条件

> create table test2 (f1 number(3) constraint fk references test(f1) deferrable initially immediate);
> alter table test2 modify constraint fk initially deferred;
表已更改。 [oracle@neworacle oracle]$ sqlplus mayp/maypSQL*Plus: Release 10.1.0.5.0 - Production on Thu Jun 26 11:05:50 2008Copyright (c) 1982, 2005, Oracle. All rights reserved.Connected to:
Oracle Database 10g Enterprise Edition Release 10.1.0.5.0 - Production
With the Partitioning and Data Mining optionsSQL> create table p(x int);Table created.SQL> alter table p add constraint pk_p primary key(x) ;Table altered. SQL> insert into p values(1);1 row created.SQL> insert into p values(1);
insert into p values(1)
*
ERROR at line 1:
ORA-00001: unique constraint (MAYP.PK_P) violated

这里在没有commit前 oracle就已经检测到了主键重复.如果是deferrable约束呢?

SQL> set constraint pk_p deferred;
set constraint pk_p deferred
*
ERROR at line 1:
ORA-02447: cannot defer a constraint that is not deferrable

注意这里不能直接修改约束的状态,必须重新创建deferrable的约束后,才能修改。

SQL> alter table p drop constraint pk_p;

Table altered.

SQL> alter table p add constraint pk_p primary key(x) deferrable;

Table altered.

现在的约束为deferrable状态:

SQL> select x from p;   

         X
———-
         1

SQL> set constraint pk_p deferred;

Constraint set.

SQL> insert into p values(1);

1 row created.

这里oracle还没有验证这个插入的1是重复的.提交的时候才验证.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-00001: unique constraint (MAYP.PK_P) violated

如果修改约束为immediate呢?

SQL> set constraint pk_p immediate;

Constraint set.

SQL> insert into p values(1);
insert into p values(1)
*
ERROR at line 1:
ORA-00001: unique constraint (MAYP.PK_P) violated

约束状态回到了最初的情况.

deferrable估计在级联更新的情况下可以用到.

目录
相关文章
|
7月前
|
Oracle 关系型数据库
Oracle 删除唯一约束
Oracle 删除唯一约束
72 0
|
10月前
|
SQL Oracle 关系型数据库
【ORACLE】 事务 | 锁 | 约束 | 权限、角色与用户管理
【ORACLE】 事务 | 锁 | 约束 | 权限、角色与用户管理
128 1
Oracle-约束小结
Oracle-约束小结
51 0
|
Oracle 关系型数据库 Java
hibernate操作Oracle出现违反唯一约束条件
出现这个问题的原因无非是主键冲突,我这里引起主键冲突的原因是实体类使用的ID策略为
|
SQL 缓存 Oracle
Oracle 数据库表和约束条件的增删改查
Oracle 数据库表和约束条件的增删改查
176 0
|
Oracle 关系型数据库 数据库
Oracle 数据库表和约束条件的增删改查
Oracle 数据库表和约束条件的增删改查
195 0
|
SQL 存储 Oracle
Oracle的视图,索引,约束,事务,数据库范式
🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线
127 0
Oracle的视图,索引,约束,事务,数据库范式
|
Oracle 关系型数据库 数据处理
oracle学习67-oracle之数据处理之约束1
oracle学习67-oracle之数据处理之约束1
121 0
oracle学习67-oracle之数据处理之约束1
|
Oracle 关系型数据库 数据库
Oracle用户操作、数据类型、表格修改、约束设置详解
Oracle用户操作、数据类型、表格修改、约束设置相关操作以及使用案例
|
Oracle 关系型数据库
oracle添加唯一约束
oracle添加唯一约束

热门文章

最新文章

推荐镜像

更多