2011-01-14 2 views
6

В Oracle отложенные ограничения проверяются только в точке фиксации.column not null deferrable

В чем смысл предложения DEFERRABLE в случае ограничения NOT NULL? Например

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 мой код работает. Благодарю. –

Смежные вопросы