oracle关于延迟约束
oracle关于延迟约束
很多时候都只知道用约束来限制某些数据以完成业务逻辑,但在实际中发现也有应用延迟约束的场景.
场景如下:
库存表使用商品ID作为唯一标志,但在某一个时刻,即进入某个ID的商品卖完之后,再进入这个商品,(业务逻辑的处理),即可能在某个事务中短暂的存在两个相同的商品ID的情况.
此时我们就要应用到延迟唯一约束了.
实验如下:
--测试表
[sql]
11:33:43 SCOTT@orcl> DESC T02
名称 是否为空? 类型
----------------------------------------------------- -------- ----------------------------------
ID NUMBER
SAL NUMBER
11:35:23 SCOTT@orcl> SELECT * FROM T02;
ID SAL
---------- ----------
1 1000
2 2000
3 6000
4 1000
5 2000
6 6000
已选择6行。
已用时间: 00: 00: 00.01
--实验(延迟验证,事务提交时验证)
[sql]
11:37:18 SCOTT@orcl> ALTER TABLE T02 ADD constraint con_uni_id UNIQUE (ID) INITIALLY DEFERRED;
表已更改。
已用时间: 00: 00: 00.56
11:37:46 SCOTT@orcl> insert into t02 select 5,2152 from dual;
已创建 1 行。
已用时间: 00: 00: 00.03
11:38:13 SCOTT@orcl> select * from t02 where id=5;
ID SAL
---------- ----------
5 2152
5 2000
已选择2行。
已用时间: 00: 00: 00.03
11:38:30 SCOTT@orcl> commit;
commit
*
第 1 行出现错误:
ORA-02091: 事务处理已回退
ORA-00001: 违反唯一约束条件 (SCOTT.CON_UNI_ID)
已用时间: 00: 00: 00.04
--立即验证(默认,也就是不加INITIALLY immediate也采用这种验证方式)
[sql]
11:38:35 SCOTT@orcl> ALTER TABLE T02 drop constraint con_uni_id;
表已更改。
已用时间: 00: 00: 00.06
11:40:56 SCOTT@orcl> ALTER TABLE T02 ADD constraint con_uni_id UNIQUE (ID) INITIALLY immediate;
表已更改。
已用时间: 00: 00: 00.07
11:41:36 SCOTT@orcl> insert into t02 select 5,2152 from dual;
insert into t02 select 5,2152 from dual
*
第 1 行出现错误:
ORA-00001: 违反唯一约束条件 (SCOTT.CON_UNI_ID)
已用时间: 00: 00: 00.01