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
роль. Мой единственный вариант - отбросить и воссоздать внешние ключи ...DISABLE TRIGGER ALL
что-то, но это не имеет никакого эффекта. Я даже не получаю предупреждения. Это просто игнорируется.Для миграции проще отключить все триггеры с помощью:
SET session_replication_role = 'replica';
И после миграции снова включите все с помощью
SET session_replication_role = 'origin';
источник
10.4
и это утверждение, похоже, не работает.