Errore PostgreSQL: 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".

Una chiave esterna è fallita in una delle sue due direzioni: una riga figlia punta a un padre che non c'è, oppure una riga padre viene rimossa mentre dei figli la referenziano ancora. La formulazione ti dice quale — "is not present in" contro "is still referenced from" — e il DETAIL indica il valore esatto della chiave.

Cosa significa questo errore

Una chiave esterna è una promessa verificata a entrambe le estremità:

Cause comuni

Come diagnosticarlo

Il DETAIL ti dà il nome del vincolo, il valore della chiave e i nomi di entrambe le tabelle. Da lì:

-- Il vincolo, per esteso:
\d orders

-- Orfani già presenti (per capire l'ampiezza del problema nei load):
SELECT o.*
FROM orders o
LEFT JOIN customers c ON c.id = o.customer_id
WHERE c.id IS NULL;

Come risolverlo

🔍 Lettura correlata: Scegliere l'indice giusto — PostgreSQL non indicizza automaticamente il lato referenziante di una chiave esterna; i delete sul padre fanno scan del figlio senza uno.