web-dev-qa-db-ja.com

Postgresダンプファイルで外部キー制約を無効にするにはどうすればよいですか?

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".

外部キーを無効にしてもこれらのエラーが発生するのはなぜですか。さらに重要なのは、どうすればそれらを防ぐことができるのですか。すべてのデータを挿入してから、外部キーを再度有効にします。

1
Dave

何が起こっているのかはわかりませんが、あなたは確かに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そして、不要なものを削除します。

8
Evan Carroll