Erreur 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".

Une clé étrangère a échoué dans l'une de ses deux directions : une ligne enfant pointe vers un parent qui n'est pas là, ou une ligne parente est en cours de suppression alors que des enfants la référencent encore. La formulation vous dit laquelle — « is not present in » versus « is still referenced from » — et le DETAIL nomme la valeur de clé exacte.

Ce que signifie cette erreur

Une clé étrangère est une promesse vérifiée aux deux bouts :

Causes fréquentes

Comment la diagnostiquer

Le DETAIL vous donne le nom de la contrainte, la valeur de clé, et les deux noms de table. À partir de là :

-- La contrainte, en détail :
\d orders

-- Orphelins déjà présents (pour évaluer l'ampleur du problème dans les chargements) :
SELECT o.*
FROM orders o
LEFT JOIN customers c ON c.id = o.customer_id
WHERE c.id IS NULL;

Comment la corriger

🔍 À lire aussi : Choisir le bon index — PostgreSQL n'indexe pas automatiquement le côté référençant d'une clé étrangère ; les suppressions sur le parent parcourent l'enfant sans lui.