PostgreSQL nie obsługuje żadnej opcji konfiguracyjnej, ale istnieje inna możliwość.
postgres=
Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │ Type │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id │ integer │ │
└────────┴─────────┴───────────┘
Foreign-key constraints:
"b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE
Integralność referencyjna w Postgres jest implementowana przez wyzwalacze i możesz wyłączyć wyzwalacze w tabeli. Dzięki tej metodzie możesz przesłać dowolne dane (ryzyko), ale jest to znacznie szybsze - ponieważ sprawdzenie dużych danych jest kosztowne. A jeśli przesyłanie jest bezpieczne, możesz to zrobić.
BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;
Następną możliwością jest użycie odroczonych ograniczeń. To sprawdzenie ograniczenia ruchu, aby zatwierdzić czas. Dlatego nie należy szanować porządku przy INSERT
poleceniach:
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".
Ta metoda powinna być dla Ciebie preferowana, ponieważ wprowadzone dane zostaną sprawdzone.
super user
rolę, aby klienci nie mogli zepsuć ustawień replikacji. Wygląda na to, że muszę być superużytkownikiem, aby wyłączyć niektóre wyzwalacze systemowe. (Obecnie używam mojego konta administratora, które jest również właścicielem - nie wiem, dlaczego to kiedyś zadziałało). Ustawienie opcji replikacji również nie jest realną opcją, ponieważ również wymagasuper user
roli. Wydaje mi się, że jedyną opcją jest upuszczenie i odtworzenie kluczy obcych ...DISABLE TRIGGER ALL
coś, ale nie ma to żadnego skutku. Nie dostaję nawet żadnego ostrzeżenia. To jest po prostu ignorowane.W przypadku migracji łatwiej jest wyłączyć wszystkie wyzwalacze za pomocą:
SET session_replication_role = 'replica';
A po migracji wszystko można ponownie włączyć za pomocą
SET session_replication_role = 'origin';
źródło
10.4
i powyższe stwierdzenie nie wydaje się działać.