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

В 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 ответ

Решение

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

SET CONSTRAINTS ALL DEFERRED;

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

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

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

Выполнив одно из этих действий, вы сможете запустить DML, который у вас есть в вопросе.

Другие вопросы по тегам