これが状況です。一方が他方を参照する2つのテーブルがあります(たとえば、table2はtable1を参照します)。これらのテーブルを作成するときに、外部キー制約をDEFERRABLEとして設定し、ONUPDATE句とONDELETE句をNOACTION(デフォルト)として設定しました。
それでも、以下のトランザクションを実行すると、次のエラーが発生します。
取引:
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
);
私がやりたいのは、トランザクションの進行中、コミットするまで外部キーチェックを延期することです。このエラーが返される理由と、トランザクションを機能させる方法がわかりません。