Ответ 1
PostgreSQL не поддерживает какой-либо параметр конфигурации, но есть и другая возможность.
postgres=# \d b
Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │ Type │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id │ integer │ │
└────────┴─────────┴───────────┘
Foreign-key constraints:
"b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE
Референциальная целостность в Postgres реализуется триггерами, и вы можете отключить триггеры в таблице. С помощью этого метода вы можете загружать любые данные (риск), но это значительно быстрее - потому что проверка больших данных стоит дорого. И если ваша загрузка безопасна, вы можете это сделать.
BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
-- now the RI over table b is disabled
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;
Следующая возможность - использование отложенных ограничений. Эта проверка ограничения перемещения для фиксации времени. Поэтому вы не должны уважать порядок с помощью команд INSERT
:
ALTER TABLE b ALTER CONSTRAINT b_id_fkey DEFERRABLE;
BEGIN
postgres=# SET CONSTRAINTS b_id_fkey DEFERRED;
SET CONSTRAINTS
postgres=# INSERT INTO b VALUES(100); -- this is not in a table
INSERT 0 1
postgres=# INSERT INTO b VALUES(10);
INSERT 0 1
postgres=# COMMIT;
ERROR: insert or update on table "b" violates foreign key constraint "b_id_fkey"
DETAIL: Key (id)=(100) is not present in table "a".
Этот метод должен быть вам предпочтительным, потому что вставленные данные будут проверены.