2011-01-14 21 views
6

In Oracle verzögerte Abhängigkeiten werden nur am Zeitpunkt der Festschreibung überprüft.Spalte nicht null verzögern

Was bedeutet die DEFERRABLE-Klausel in einem NOT NULL-Constraint? Zum Beispiel

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

Nach diesen Aussagen dachte ich, der folgende Code

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

funktionieren würde, aber es funktioniert nicht.

Was ist der Unterschied zwischen zwei Definitionen?

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

Antwort

10

Hier gibt es zwei Möglichkeiten. Entweder müssen Sie die Einschränkung festlegen innerhalb der Transaktion verschoben werden, indem Sie den Befehl unten gezeigt

SET CONSTRAINTS ALL DEFERRED; 

Dies sollte, bevor Sie die UPDATE Anweisung ausgeführt werden, die Sie definiert haben.

Alternativ können Sie die Einschränkung festgelegt INITIALLY DEFERRED in der Tabellendefinition

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

Nachdem ich entweder diese Dinge zu sein, sollten Sie dann in der Lage sein, die DML auszuführen, die Sie in der Frage haben.

+1

Ja, Sie haben Recht. Mit INITIALLY DEFERRED funktioniert mein Code. Vielen Dank. –

Verwandte Themen