ORACLE中约束-DEFERRABLE

今天看到了oracle的约束。提到DEFERRABLE.

定义为可延迟(deferrable)的约束,可以指定为:
1.INITIALLY IMMEDIATE 初始化立即执行
2.INITIALLY DEFERRED    初始化延迟执行

从字面意思看,猜测是让约束延迟检查,但是一个初始化立即执行,一个初始化延迟执行。这又是什么意思? 我们动手测试一下吧


--延迟约束测试 
CREATE TABLE CUST
(
    CUST_ID NUMBER(2) NOT NULL,
    CUST_NAME VARCHAR2(15)
); 
SELECT * FROM CUST; 
Table created
CUST_ID CUST_NAME
------- --------------- 
--新增初始化延迟约束 
ALTER TABLE CUST ADD CONSTRAINT CUST_ID_PK PRIMARY KEY(CUST_ID) DEFERRABLE INITIALLY DEFERRED; 
--插入数据测试 
INSERT INTO CUST VALUES (1,'RAJ'); -- ROW 1 
INSERT INTO CUST VALUES (1,'SAM'); -- ROW 2 
COMMIT
1 row inserted
1 row inserted
COMMIT
ORA-02091: 事务处理已回退
ORA-00001: 违反唯一约束条件 (SCOTT.CUST_ID_PK) 

我们指定了约束DEFERRED,在执行第ROW1,ROW2行SQL,并不会理解报错。在COMMIT的时候验证约束,报错整个事务也被ROLLBACK了。

此时呢,我们修改约束为IMMEDIATE,让它在SQL语句执行后进行验证

SET CONSTRAINT CUST_ID_PK IMMEDIATE; 
INSERT INTO CUST VALUES (1,'LATA'); --ROW 3 
INSERT INTO CUST VALUES (2,'KING'); --ROW 4 
COMMIT;
Constraints set
1 row inserted
1 row inserted
Commit complete

OK,两条数据提交成功。

再来插入一条重复PK的数据试试:)

SET CONSTRAINT CUST_ID_PK IMMEDIATE; 
INSERT INTO CUST VALUES (2,'IIMAX'); --ROW 5 
COMMIT;
 
    
Constraints set
INSERT INTO CUST VALUES (2,'IIMAX')
ORA-00001: 违反唯一约束条件 (SCOTT.CUST_ID_PK)
Commit complete

仍然是ORA-00001错误

文章同步:http://oracle.xyhui.net/post/2012-10-30/oracle-constraint-deferrable

自己动手,对概念理解的更透彻。希望有所帮助

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30146442/viewspace-2125187/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30146442/viewspace-2125187/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值