赞
踩
很多时候都只知道用约束来限制某些数据以完成业务逻辑,但在实际中发现也有应用延迟约束的场景.
场景如下:
库存表使用商品ID作为唯一标志,但在某一个时刻,即进入某个ID的商品卖完之后,再进入这个商品,(业务逻辑的处理),即可能在某个事务中短暂的存在两个相同的商品ID的情况.
此时我们就要应用到延迟唯一约束了.
实验如下:
--测试表
- 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
--实验(延迟验证,事务提交时验证)
- 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也采用这种验证方式)
- 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。