約束延期是一個(gè)對(duì)主鍵、唯一鍵等約束進(jìn)行延遲檢查的功能??梢允褂迷摴δ軐⒓s束檢查延遲到事務(wù)提交時(shí),而不是在進(jìn)行DDL操作之后立即進(jìn)行檢查。所以對(duì)約束檢查也有這兩個(gè)選項(xiàng):延遲和立即。
?比如對(duì)于表t_test
?Name Type???????? Nullable Default Comments
---- ------------ -------- ------- --------
NAME VARCHAR2(12) Y????????????????????????
AGE? NUMBER(5)??? Y????????????????????????
通過這個(gè)語(yǔ)句增加一個(gè)延遲檢查的主鍵約束:
alter table t_test add constraint pk_name primary key (name) DEFERRABLE INITIALLY DEFERRED;
執(zhí)行如下操作:
SQL>insert into t_test values ('Tom',32);
1 row inserted
SQL> commit;
Commit complete
SQL> select * from t_test;
NAME??????????? AGE
------------ ------
Tom??????? 32
SQL> insert into t_test values ('Tom',32);
1 row inserted
SQL> commit;
commit
ORA-02091: 事務(wù)處理已重算
ORA-00001: 違反唯一約束條件 (SCOTT.PK_NAME)
這個(gè)唯一約束條件的檢查時(shí)在commit時(shí)候進(jìn)行檢查的,而不是在insert了違反約束條件的值之后馬上進(jìn)行檢查。