您的位置:首页 > 数据库 > Oracle

ORACLE中约束-DEFERRABLE

2012-10-30 14:20 288 查看
今天看到了oracle的约束。提到DEFERRABLE,很新鲜,至少SQL SERVER里是没这玩意儿。


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


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

--延迟约束测试
CREATE TABLE CUST
(
CUST_ID NUMBER(2) NOT NULL,
CUST_NAME VARCHAR2(15)
);
SELECT * FROM CUST;
--新增初始化延迟约束
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;
--ORA-02091: transaction rolled back
--ORA-00001: unique constraint (IIMAX.CUST_ID_PK) violated


我们指定了约束DEFERRED,在执行第13、14行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;


OK,两条数据提交成功。

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

SET CONSTRAINT CUST_ID_PK IMMEDIATE;
INSERT INTO CUST VALUES (2,'IIMAX'); --ROW 5
COMMIT;


仍然是ORA-00001错误

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

自己动手,对概念理解的更透彻。希望有所帮助
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: