关于延迟约束

--------------------------------------------------------------------------
-----------------------------Cryking原创------------------------------
-----------------------转载请注明出处,谢谢!------------------------

很多时候都只知道用约束来限制某些数据以完成业务逻辑,但在实际中发现也有应用延迟约束的场景.

场景如下:

库存表使用商品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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值