2011-01-14 63 views
6

在Oracle中,延遲約束僅在提交時檢查。column not null deferredrable

在NOT NULL約束的情況下,DEFERRABLE子句是什麼意思? 例如

create table test(a number not null deferrable, b number); 
insert into test(a,b) values (222, 111); 
commit; 

這些語句後,我想下面的代碼將工作

update test set a = null where b = 111; 
delete test where b = 111; 
commit; 

但事實並非如此。

兩個定義有什麼區別?

create table test1(a number not null deferrable, b number); 
create table test2(a number not null, b number); 

回答

10

這裏有兩種選擇。要麼你需要使用下面

SET CONSTRAINTS ALL DEFERRED; 

此所示的命令來設置約束的事務中被推遲應該做你所定義的UPDATE語句之前運行。

另外,您可以設置約束在表中定義INITIALLY DEFERRED

create table test(a number not null initially deferred deferrable, b number); 

要麼做這些事情後,你應該然後能夠運行,你的問題有DML。

+1

是的,你是對的。使用INITIALLY DEFERRED我的代碼工作。謝謝。 – 2011-01-14 10:53:13

相關問題