PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL:Eindeutigkeitsverletzung:7 FEHLER:Doppelter Schlüsselwert verletzt eindeutige Einschränkung users_pkey

Postgres handhabt das automatische Inkrementieren etwas anders als MySQL. In Postgres, wenn Sie die serial erstellen Feld erstellen Sie auch ein Sequenzfeld, das die zu verwendende ID verfolgt. Dieses Sequenzfeld beginnt mit dem Wert 1.

Wenn Sie einen neuen Datensatz in die Tabelle einfügen, wenn Sie die id nicht angeben Feld, wird der Wert der Sequenz verwendet und dann die Sequenz erhöht. Wenn Sie jedoch die id angeben Feld, dann wird die Sequenz nicht verwendet und auch nicht aktualisiert.

Ich gehe davon aus, dass Sie beim Wechsel zu Postgres einige vorhandene Benutzer zusammen mit ihren vorhandenen IDs gesetzt oder importiert haben. Als Sie diese Benutzerdatensätze mit ihren IDs erstellt haben, wurde die Sequenz nicht verwendet und daher nie aktualisiert.

Wenn Sie also beispielsweise 10 Benutzer importiert haben, haben Sie Benutzer mit den IDs 1-10, aber Ihre Sequenz ist immer noch bei 1. Wenn Sie versuchen, einen neuen Benutzer zu erstellen, ohne die ID anzugeben, wird der Wert aus der Sequenz gezogen ( 1), und Sie erhalten einen eindeutigen Verstoß, weil Sie bereits einen Benutzer mit der ID 1 haben.

Um das Problem zu lösen, müssen Sie Ihre users_id_seq festlegen Sequenzwert auf die MAX(id) Ihrer bestehenden Benutzer. Sie können diese Frage/Antwort lesen, um weitere Informationen zum Zurücksetzen der Sequenz zu erhalten, aber Sie können auch Folgendes versuchen (ungetestet):

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

FYI, dies ist kein Problem in MySQL, da MySQL automatisch die Auto-Inkrement-Sequenz auf den größten Spaltenwert aktualisiert, wenn ein Wert manuell in das Auto-Increment-Feld eingefügt wird.