PostgreSQL не підтримує жодних параметрів конфігурації, але існує ще одна можливість.
postgres=
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;
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;
Наступна можливість - використання відкладених обмежень. Ця перевірка обмеження на переміщення для фіксації часу. Тому не слід поважати порядок за допомогою INSERT
команд:
ALTER TABLE b ALTER CONSTRAINT b_id_fkey DEFERRABLE;
BEGIN
postgres=
SET CONSTRAINTS
postgres=
INSERT 0 1
postgres=
INSERT 0 1
postgres=
ERROR: insert or update on table "b" violates foreign key constraint "b_id_fkey"
DETAIL: Key (id)=(100) is not present in table "a".
Цей спосіб повинен бути кращим для вас, оскільки вставлені дані будуть перевірені.
super user
роль, щоб клієнти не могли зіпсувати налаштування реплікації. Схоже, я повинен бути суперкористувачем, щоб відключити деякі системні тригери. (Зараз я використовую свій обліковий запис адміністратора, який також є власником - я не впевнений, чому це спрацювало одного разу.) Встановлення параметра реплікації також не є життєздатним варіантом, оскільки для цього також потрібнаsuper user
роль. Здається, мій єдиний варіант - скинути та відтворити зовнішні ключі ...