столбец не пусто - PullRequest
       2

столбец не пусто

6 голосов
/ 14 января 2011

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

Что означает предложение 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);

1 Ответ

10 голосов
/ 14 января 2011

Здесь есть два варианта.Либо вам нужно установить ограничение, которое будет отложено внутри транзакции, с помощью команды, показанной ниже

SET CONSTRAINTS ALL DEFERRED;

Это должно быть выполнено перед выполнением оператора UPDATE, который вы определили.

В качестве альтернативы вы можете установить ограничение на INITIALLY DEFERRED в определении таблицы

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

После выполнения любой из этих вещей вы сможете запустить DML, который у вас есть ввопрос.

...