Errore 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 o UPDATE ha provato a creare una seconda riga con lo stesso valore in una colonna (o insieme di colonne) coperta da un vincolo di unicità o da un indice unique. La riga DETAIL ti dice esattamente quale vincolo e quale valore — la diagnosi parte da lì.

Cosa significa questo errore

Il vincolo ha funzionato: PostgreSQL garantisce l'unicità anche in concorrenza, e questo errore è quella garanzia che scatta. Due cose che vale la pena sapere oltre l'ovvio:

Cause comuni

Come diagnosticarlo

-- Quale vincolo, quali colonne:
\d users

-- Sospetto "sequenza rimasta indietro" (errore sulla _pkey con id seriali):
SELECT max(id) FROM users;
SELECT last_value FROM users_id_seq;
-- se last_value <= max(id), è questa la causa

Se il vincolo è su una chiave di business (email, SKU, …) anziché sulla primary key, guarda da dove viene il valore in DETAIL: stesso utente che invia due volte, logica di retry, o due percorsi di codice che creano la stessa entità.

Come risolverlo

🔍 Lettura correlata: Scegliere l'indice giusto — indici unique, parziali e su espressione, e quanto costano in scrittura.