Подтвердить что ты не робот

SET CONSTRAINTS ALL DEFERRED не работает должным образом в 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: 23503 Деталь: Ключ (j) = (2) отсутствует в таблице "a".

4b9b3361

Ответ 1

Для начала можно отложить только ограничения DEFERRABLE.

Но это не поможет вашему делу, потому что ограничения FK не могут быть согнуты таким образом вообще. В документации:

Ссылочные действия, отличные от проверки NO ACTION, не могут быть отложены, даже если ограничение объявлено отложенным.

Отмените последовательность своих операторов INSERT.

по теме: