PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:Violazione univoca:7 ERRORE:il valore della chiave duplicata viola il vincolo univoco users_pkey

Postgres gestisce l'incremento automatico in modo leggermente diverso rispetto a MySQL. In Postgres, quando crei il serial campo, stai anche creando un campo sequenza che tiene traccia dell'ID da utilizzare. Questo campo della sequenza inizierà con un valore di 1.

Quando inserisci un nuovo record nella tabella, se non specifichi l'id campo, utilizzerà il valore della sequenza e quindi incrementerà la sequenza. Tuttavia, se specifichi l'id campo, la sequenza non viene utilizzata e nemmeno aggiornata.

Presumo che quando sei passato a Postgres, hai seminato o importato alcuni utenti esistenti, insieme ai loro ID esistenti. Quando hai creato questi record utente con i loro ID, la sequenza non è stata utilizzata e quindi non è mai stata aggiornata.

Quindi, se, ad esempio, hai importato 10 utenti, hai utenti con ID 1-10, ma la tua sequenza è ancora a 1. Quando tenti di creare un nuovo utente senza specificare l'id, estrae il valore dalla sequenza ( 1) e ricevi una violazione univoca perché hai già un utente con ID 1.

Per risolvere il problema, devi impostare il tuo users_id_seq valore di sequenza al MAX(id) degli utenti esistenti. Puoi leggere questa domanda/risposta per ulteriori informazioni sul ripristino della sequenza, ma puoi anche provare qualcosa come (non testato):

SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;

Cordiali saluti, questo non è un problema in MySQL perché MySQL aggiorna automaticamente la sequenza di incremento automatico al valore della colonna più grande quando un valore viene inserito manualmente nel campo di incremento automatico.