2011-01-14 24 views
6

En Oracle, las restricciones diferidas solo se verifican en el punto de confirmación.columna no nula diferible

¿Cuál es el significado de la cláusula DEFERRABLE en un caso de restricción NOT NULL? Por ejemplo

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

Después de estas declaraciones me pareció que el siguiente código funcionaría

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

pero no es así.

¿Cuál es la diferencia entre dos definiciones?

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

Respuesta

10

Aquí hay dos opciones. O bien es necesario establecer la restricción a diferir dentro de la transacción utilizando el comando se muestra a continuación

SET CONSTRAINTS ALL DEFERRED; 

Esto se debe ejecutar antes de hacer la declaración UPDATE que haya definido.

o también puede configurar la restricción de ser INITIALLY DEFERRED en la definición de tabla

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

Después de hacer cualquiera de estas cosas, a continuación, debería ser capaz de ejecutar la LMD que tiene en la pregunta.

+1

Sí, tienes razón. Con INITIALLY DEFERRED, mi código funciona. Gracias. –

Cuestiones relacionadas