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

PostgreSQL:Unik overtrædelse:7 FEJL:dubletnøgleværdi overtræder unik begrænsning users_pkey

Postgres håndterer automatisk inkrementering lidt anderledes end MySQL gør. I Postgres, når du opretter serial felt, opretter du også et sekvensfelt, der holder styr på det id, der skal bruges. Dette sekvensfelt starter med en værdi på 1.

Når du indsætter en ny post i tabellen, hvis du ikke angiver id felt, vil den bruge værdien af ​​sekvensen og derefter øge sekvensen. Men hvis du angiver id felt, så bruges sekvensen ikke, og den opdateres heller ikke.

Jeg går ud fra, at når du flyttede over til Postgres, så eller importerede du nogle eksisterende brugere sammen med deres eksisterende id'er. Når du oprettede disse brugerposter med deres id'er, blev sekvensen ikke brugt, og den blev derfor aldrig opdateret.

Så hvis du for eksempel importerede 10 brugere, har du brugere med id 1-10, men din sekvens er stadig på 1. Når du forsøger at oprette en ny bruger uden at angive id'et, trækker den værdien fra sekvensen ( 1), og du får en unik overtrædelse, fordi du allerede har en bruger med id 1.

For at løse problemet skal du indstille din users_id_seq sekvensværdi til MAX(id) for dine eksisterende brugere. Du kan læse dette spørgsmål/svar for mere information om nulstilling af sekvensen, men du kan også prøve noget i stil med (utestet):

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

FYI, dette er ikke et problem i MySQL, fordi MySQL automatisk opdaterer den automatiske stigningssekvens til den største kolonneværdi, når en værdi manuelt indsættes i feltet for automatisk stigning.



  1. FORALL-erklæring med nedre og øvre grænse i Oracle-databasen

  2. Laravel:PDO Undtagelse:kunne ikke finde driveren

  3. Neo4j Query Language - Cypher

  4. Få liste over tabeller med eller uden primær nøglebegrænsning i alle databaser fra SQL Server Instance - SQL Server / TSQL Tutorial Del 61