sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL:Unieke overtreding:7 FOUT:dubbele sleutelwaarde schendt unieke beperking users_pkey

Postgres verwerkt automatisch ophogen iets anders dan MySQL. Wanneer u in Postgres de serial . maakt veld, maakt u ook een sequentieveld dat de te gebruiken id bijhoudt. Dit reeksveld begint met een waarde van 1.

Wanneer u een nieuw record in de tabel invoegt en u de id . niet opgeeft veld, zal het de waarde van de reeks gebruiken en vervolgens de reeks verhogen. Als u echter de id veld, dan wordt de reeks niet gebruikt en ook niet bijgewerkt.

Ik neem aan dat toen je overstapte naar Postgres, je een aantal bestaande gebruikers hebt gezaaid of geïmporteerd, samen met hun bestaande id's. Toen u deze gebruikersrecords met hun id's aanmaakte, werd de reeks niet gebruikt en daarom nooit bijgewerkt.

Dus als u bijvoorbeeld 10 gebruikers hebt geïmporteerd, heeft u gebruikers met id's 1-10, maar uw reeks staat nog steeds op 1. Wanneer u probeert een nieuwe gebruiker aan te maken zonder de id op te geven, haalt het de waarde uit de reeks ( 1), en je krijgt een unieke overtreding omdat je al een gebruiker hebt met id 1.

Om het probleem op te lossen, moet u uw users_id_seq . instellen reekswaarde naar de MAX(id) van uw bestaande gebruikers. U kunt deze vraag/het antwoord lezen voor meer informatie over het opnieuw instellen van de reeks, maar u kunt ook iets proberen als (niet getest):

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

Ter informatie, dit is geen probleem in MySQL omdat MySQL de automatische ophogingsreeks automatisch bijwerkt naar de grootste kolomwaarde wanneer een waarde handmatig wordt ingevoegd in het automatische ophogingsveld.



  1. Samengestelde PRIMARY KEY dwingt NOT NULL-beperkingen af ​​op betrokken kolommen

  2. Hoe u de nieuwste functies in Office 365 krijgt

  3. Hoe regexp in sqlite te gebruiken

  4. Kan lekkage van SQLiteConnection-object niet voorkomen