Erreur PostgreSQL : duplicate key value violates unique constraint

ERROR:  duplicate key value violates unique constraint "users_email_key"
DETAIL:  Key (email)=([email protected]) already exists.

Un INSERT ou un UPDATE a tenté de créer une deuxième ligne avec la même valeur dans une colonne (ou un ensemble de colonnes) couverte par une contrainte d'unicité ou un index unique. La ligne DETAIL vous indique exactement quelle contrainte et quelle valeur — le diagnostic part de là.

Ce que signifie cette erreur

La contrainte a fonctionné : PostgreSQL garantit l'unicité même sous concurrence, et cette erreur est cette garantie qui se déclenche. Deux choses à savoir au-delà de l'évidence :

Causes fréquentes

Comment la diagnostiquer

-- Quelle contrainte, quelles colonnes :
\d users

-- Suspicion « séquence restée en arrière » (erreur sur la _pkey avec des id seriaux) :
SELECT max(id) FROM users;
SELECT last_value FROM users_id_seq;
-- si last_value <= max(id), c'est la cause

Si la contrainte porte sur une clé métier (email, SKU, …) plutôt que sur la clé primaire, regardez d'où vient la valeur du DETAIL : le même utilisateur qui soumet deux fois, une logique de réessai, ou deux chemins de code créant la même entité.

Comment la corriger

🔍 À lire aussi : Choisir le bon index — les index uniques, partiels et sur expression, et ce qu'ils coûtent aux écritures.