13

これが状況です。一方が他方を参照する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
);

私がやりたいのは、トランザクションの進行中、コミットするまで外部キーチェックを延期することです。このエラーが返される理由と、トランザクションを機能させる方法がわかりません。

4

1 に答える 1

7

問題は確かに外部キー制約違反でした。つまり、制約は実際にトランザクション内で延期されましたが、問題は、トランザクションの終了時に、table1とtable2が更新された後、新しいデータが外部キー制約に違反していたことでした。table1行の主キーを更新していましたが、それはまだいくつかのtable2行によって参照されていました。これらの行も更新する必要があったため、table2行の参照列は、table1の行の更新された主キーと一致しました。トランザクション内の「UPDATE」クエリを変更したところ、問題は解決しました。

これにあなたを入れてすみません。解決策はとても簡単でしたが、その日私はそれを見ることができませんでした。

于 2011-02-28T13:53:46.657 に答える