Установить ограничения все отложено не работает как ожидалось в PostgreSQL 9.3
Если я определяю таблицы a
и b
следующим образом:
CREATE TABLE a(i integer);
ALTER TABLE a ADD CONSTRAINT pkey_a PRIMARY KEY (i);
CREATE TABLE b(j integer);
ALTER TABLE b add CONSTRAINT fkey_ij FOREIGN KEY (j)
REFERENCES a (i) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;
INSERT INTO a(i) VALUES(1);
А затем сделайте следующее:
START TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO b(j) VALUES(2);
INSERT INTO a(i) VALUES(2);
COMMIT;
Это приводит к ошибке ниже. Почему SET CONSTRAINTS
не дает желаемого эффекта?
Ошибка: вставка или обновление таблицы " b " нарушает ограничение внешнего ключа "fkey_ij"
SQL state: 23503 Detail: Key (j)=(2) отсутствует в таблице "a".
1 ответ:
Для начала, только ограничения
DEFERRABLE
могут быть отложены.Но это не поможет вашему случаю, потому что ограничения FK не могут быть изогнуты таким образом вообще. согласно документации :
Референтные действия, отличные от проверки
NO ACTION
, не могут быть отложены., даже если ограничение объявлено отложенным.Измените последовательность ваших утверждений
INSERT
.Связанные: