Postgres 9.5を使用しています。 3つのテーブルのINSERTのダンプファイルを作成しました。外部キーエラーを回避するために、ファイルの上部と下部に以下を追加しました(「…」はすべてのINSERTがある場所です)…
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;
SET search_path = public, pg_catalog;
ALTER TABLE addresses DISABLE TRIGGER ALL;
ALTER TABLE table1 DISABLE TRIGGER ALL;
ALTER TABLE table2 DISABLE TRIGGER ALL;
…
ALTER TABLE addresses ENABLE TRIGGER ALL;
ALTER TABLE table1 ENABLE TRIGGER ALL;
ALTER TABLE table2 ENABLE TRIGGER ALL;
しかし、このファイルを実行しても、次のようなエラーが発生します
ERROR: insert or update on table "table2" violates foreign key constraint "fk_Rails_ba656ceafa"
DETAIL: Key (table1_id)=(f62c5fee-1031-4d5e-a084-9210f052a2d1) is not present in table "table1".
外部キーを無効にしてもこれらのエラーが発生するのはなぜですか。さらに重要なのは、どうすればそれらを防ぐことができるのですか。すべてのデータを挿入してから、外部キーを再度有効にします。
何が起こっているのかはわかりませんが、あなたは確かにnotに十分な情報を提供しています。 ALTER TABLE DISABLE TRIGGER ALL
を無効にすると正常に機能しますFOREIGN KEYS
。
test=# CREATE TABLE table1 ( id serial PRIMARY KEY );
CREATE TABLE
test=# CREATE TABLE table2 ( fkey int REFERENCES table1(id) );
CREATE TABLE
test=# INSERT INTO table2 VALUES (1);
ERROR: insert or update on table "table2" violates foreign key constraint "table2_fkey_fkey"
DETAIL: Key (fkey)=(1) is not present in table "table1".
test=# ALTER TABLE table2 DISABLE TRIGGER ALL;
ALTER TABLE
test=# INSERT INTO table2 VALUES (1);
INSERT 0 1
私は決してだれも提案しないだろうDISABLE TRIGGERS
、またはそれらを作成するNOT VALID
。それらはデータの整合性を確保するために存在し、短期間でもそれらを無効にすることは災害のレシピであり、私の意見ではアンチパターンです。
ただpg_dumpall
そして、不要なものを削除します。