Установка отложенного ограничения не работает для транзакции PostgreSQL

Вот такая ситуация: у меня есть две таблицы, одна из которых ссылается на другую (скажем, table2 ссылается на 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
);

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

13
задан frabala 22 February 2011 в 19:44
поделиться