当前位置:数据库 > Oracle >>

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  
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,