Столбец не пусто
В 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, который у вас есть в вопросе.