PostgreSQL-Fehler: violates foreign key constraint

ERROR:  insert or update on table "orders" violates foreign key constraint "orders_customer_id_fkey"
DETAIL:  Key (customer_id)=(42) is not present in table "customers".

-- direzione opposta:
ERROR:  update or delete on table "customers" violates foreign key constraint "orders_customer_id_fkey" on table "orders"
DETAIL:  Key (id)=(42) is still referenced from table "orders".

Ein Fremdschlüssel ist in einer seiner beiden Richtungen fehlgeschlagen: eine Kindzeile zeigt auf ein Elternteil, das nicht da ist, oder eine Elternzeile wird entfernt, während Kinder sie noch referenzieren. Die Formulierung sagt Ihnen welche — "is not present in" versus "is still referenced from" — und das DETAIL nennt den genauen Schlüsselwert.

Was dieser Fehler bedeutet

Ein Fremdschlüssel ist ein Versprechen, das an beiden Enden geprüft wird:

Häufige Ursachen

So diagnostizieren Sie ihn

Das DETAIL liefert Ihnen den Constraint-Namen, den Schlüsselwert und beide Tabellennamen. Von da aus:

-- Der Constraint, ausführlich:
\d orders

-- Bereits vorhandene Waisen (um das Ausmaß des Problems bei Ladevorgängen zu verstehen):
SELECT o.*
FROM orders o
LEFT JOIN customers c ON c.id = o.customer_id
WHERE c.id IS NULL;

So beheben Sie ihn

🔍 Weiterführend: Den richtigen Index wählen — PostgreSQL indiziert die referenzierende Seite eines Fremdschlüssels nicht automatisch; Löschungen am Elternteil scannen ohne Index das Kind.