PostgreSQL unterstützt keine Konfigurationsoption, es gibt jedoch eine andere Möglichkeit.
postgres=
Table "public.b"
┌────────┬─────────┬───────────┐
│ Column │ Type │ Modifiers │
╞════════╪═════════╪═══════════╡
│ id │ integer │ │
└────────┴─────────┴───────────┘
Foreign-key constraints:
"b_id_fkey" FOREIGN KEY (id) REFERENCES a(id) DEFERRABLE
Die referenzielle Integrität in Postgres wird durch Trigger implementiert, und Sie können Trigger für Tabellen deaktivieren. Mit dieser Methode können Sie beliebige Daten hochladen (Risiko), diese sind jedoch erheblich schneller - da die Überprüfung großer Datenmengen teuer ist. Und wenn Ihr Upload sicher ist, können Sie es tun.
BEGIN;
ALTER TABLE b DISABLE TRIGGER ALL;
ALTER TABLE b ENABLE TRIGGER ALL;
COMMIT;
Die nächste Möglichkeit ist die Verwendung von verzögerten Einschränkungen. Diese Verschiebungsbeschränkungsprüfung zum Festschreiben der Zeit. Sie sollten also die Reihenfolge mit INSERT
Befehlen nicht respektieren :
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".
Diese Methode sollte für Sie bevorzugt werden, da die eingefügten Daten überprüft werden.
super user
Rolle sperren, damit Kunden die Replikationseinstellungen nicht durcheinander bringen können. Es sieht so aus, als müsste ich ein Superuser sein, um einige Systemauslöser zu deaktivieren. (Ich verwende derzeit mein Administratorkonto, das auch der Eigentümer ist. Ich bin nicht sicher, warum es einmal funktioniert hat.) Das Festlegen der Replikationsoption ist ebenfalls keine praktikable Option, da hierfür auch diesuper user
Rolle erforderlich ist . Meine einzige Möglichkeit scheint darin zu bestehen, die Fremdschlüssel zuDISABLE TRIGGER ALL
Etwas tun , aber es hat keine Wirkung. Ich bekomme nicht einmal eine Warnung. Es wird einfach ignoriert.Für die Migration ist es einfacher, alle Trigger zu deaktivieren mit:
SET session_replication_role = 'replica';
Und nach der Migration wieder mit aktivieren
SET session_replication_role = 'origin';
quelle
10.4
und diese obige Aussage scheint nicht zu funktionieren.