Отключение установки ограничений не работает на транзакции PostgreSQL

В этой ситуации: у меня две таблицы, где одна ссылается на другую (скажем, table2 reference table1). При создании этих таблиц я установил ограничение внешнего ключа как DEFERRABLE и предложения ON UPDATE и ON DELETE как NO ACTION (по умолчанию).

Но все же, при выполнении транзакции ниже, я получаю следующую ошибку.

Сделка:

START TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
UPDATE table1 SET blah blah;
UPDATE table2 SET blah blah;
COMMIT;

Ошибка:

ERROR:  update or delete on table "table1" violates foreign key constraint "table1_column_fkey" on table "table2"
DETAIL:  Key (column1)=(blahblah) is still referenced from table "table2".

И построение таблицы:

CREATE TABLE table1(
    column1 CHAR(10),
    [...]
    PRIMARY KEY (column1)
);

CREATE TABLE table2(
    primkey CHAR(9),
    [...]
    column2 CHAR(10) NOT NULL,
    PRIMARY KEY(primkey),
    FOREIGN KEY(column2) REFERENCES table1(column1) DEFERRABLE
);

Что я хочу сделать, так это отложить проверку внешнего ключа во время транзакции, пока он не совершит. Я просто не понимаю, почему эта ошибка возвращается и как я могу заставить транзакцию работать.

Ответы

Ответ 1

Проблема была действительно нарушением ограничения внешнего ключа. Я имею в виду, что ограничения действительно были отложены в транзакции, но проблема заключалась в том, что в конце транзакции после обновления таблиц1 и таблицы2 новые данные нарушали ограничение внешнего ключа. Я обновлял первичный ключ строки table1, на которую все еще ссылались некоторые строки таблицы2. Эти строки я должен был их обновить, так что столбец ссылок строк таблицы2 соответствовал обновленному первичному ключу строки table1. Я изменил запросы "UPDATE" в транзакции, и проблема была решена.

Извините, что ввел вас в это. Решение было настолько простым, но в тот день я не видел его.