2011-01-14 3 views
6

Dans Oracle, les contraintes différées sont vérifiées uniquement au moment de la validation.colonne non null déférrable

Quelle est la signification de la clause DEFERRABLE dans le cas d'une contrainte NOT NULL? Par exemple

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

Après ces déclarations je pensais que le code suivant travaillerait

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

Mais il ne fonctionne pas.

Quelle est la différence entre deux définitions?

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

Répondre

10

Il existe deux options ici. Soit vous devez définir la contrainte à différer dans la transaction en utilisant la commande ci-dessous

SET CONSTRAINTS ALL DEFERRED; 

Cela devrait être exécuté avant de faire la déclaration UPDATE que vous avez défini.

Vous pouvez également choisir la contrainte d'être INITIALLY DEFERRED dans la définition de la table

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

Après avoir fait l'une de ces choses, vous devriez alors être en mesure d'exécuter le DML que vous avez dans la question.

+1

Oui, vous avez raison. Avec INITIALLY DEFERRED mon code fonctionne. Merci. –