sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL:Unik överträdelse:7 FEL:dubblettnyckelvärde bryter mot unika begränsningar users_pkey

Postgres hanterar automatisk inkrementering lite annorlunda än vad MySQL gör. I Postgres, när du skapar serial fältet skapar du också ett sekvensfält som håller reda på det id som ska användas. Detta sekvensfält kommer att börja med värdet 1.

När du infogar en ny post i tabellen, om du inte anger id fältet kommer den att använda sekvensens värde och sedan öka sekvensen. Men om du anger id fältet används inte sekvensen och den uppdateras inte heller.

Jag antar att när du flyttade över till Postgres så sådde eller importerade du några befintliga användare, tillsammans med deras befintliga ID. När du skapade dessa användarposter med deras ID användes inte sekvensen och därför uppdaterades den aldrig.

Så, om du till exempel importerade 10 användare, har du användare med id 1-10, men din sekvens är fortfarande på 1. När du försöker skapa en ny användare utan att ange id, hämtar den värdet från sekvensen ( 1), och du får en unik överträdelse eftersom du redan har en användare med id 1.

För att lösa problemet måste du ställa in din users_id_seq sekvensvärdet till MAX(id) för dina befintliga användare. Du kan läsa den här frågan/svaret för mer information om hur du återställer sekvensen, men du kan också prova något i stil med (otestat):

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

FYI, detta är inte ett problem i MySQL eftersom MySQL automatiskt uppdaterar den automatiska ökningssekvensen till det största kolumnvärdet när ett värde manuellt infogas i fältet för automatisk ökning.



  1. Codds regler i SQL

  2. Komma igång med PostgreSQL 11 på Ubuntu 18.04

  3. Hur bearbetar MySQL ORDER BY och LIMIT i en fråga?

  4. Använd psqls \copy för en flerradsfråga