2011-01-14 17 views
6

In Oracle i vincoli posticipati vengono controllati solo al punto di commit.colonna non nullo deferrabile

Qual è il significato della clausola DEFERRABLE in un caso di vincolo NOT NULL? Per esempio

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

Dopo queste dichiarazioni ho pensato che il seguente codice funzionerebbe

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

ma non è così.

Qual è la differenza tra due definizioni?

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

risposta

10

Ci sono due opzioni qui. O è necessario impostare il vincolo di essere differita all'interno della transazione utilizzando il comando indicato di seguito

SET CONSTRAINTS ALL DEFERRED; 

Questo dovrebbe essere eseguito prima di fare la dichiarazione UPDATE che avete definito.

In alternativa è possibile impostare il vincolo di essere INITIALLY DEFERRED nella definizione della tabella

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

Dopo aver fatto una di queste cose, si dovrebbe quindi essere in grado di eseguire il DML che si ha nella questione.

+1

Sì, hai ragione. Con INITIALLY DEFERRED il mio codice funziona. Grazie. –

Problemi correlati