PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL:Уникално нарушение:7 ГРЕШКА:дублиращата се стойност на ключа нарушава уникалното ограничение users_pkey

Postgres се справя с автоматичното нарастване малко по-различно от MySQL. В Postgres, когато създадете serial поле, вие също така създавате поле за последователност, което следи идентификатора, който да използвате. Това поле за последователност ще започне със стойност 1.

Когато вмъкнете нов запис в таблицата, ако не посочите id поле, то ще използва стойността на последователността и след това ще увеличи последователността. Ако обаче посочите id поле, тогава последователността не се използва и също не се актуализира.

Предполагам, че когато сте преминали към Postgres, сте заредили или импортирали някои съществуващи потребители, заедно с техните съществуващи идентификатори. Когато сте създали тези потребителски записи с техните идентификатори, последователността не е била използвана и следователно никога не е била актуализирана.

Така че, ако например сте импортирали 10 потребители, имате потребители с идентификационни номера 1-10, но вашата последователност все още е 1. Когато се опитате да създадете нов потребител, без да посочите идентификатора, той изтегля стойността от последователността ( 1) и получавате уникално нарушение, защото вече имате потребител с идентификатор 1.

За да разрешите проблема, трябва да зададете своя users_id_seq стойност на последователността до MAX(id) на съществуващите ви потребители. Можете да прочетете този въпрос/отговор за повече информация относно нулирането на последователността, но можете също да опитате нещо като (нетествано):

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

FYI, това не е проблем в MySQL, защото MySQL автоматично актуализира последователността за автоматично увеличение до най-голямата стойност на колоната, когато стойност се вмъкне ръчно в полето за автоматично увеличение.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да защитите вашите PostgreSQL бази данни от кибератаки с SQL защитна стена

  2. connection.select_value връща само низове в postgres с pg gem

  3. алтернатива на mysql_insert_id за postgresql

  4. Вземете Century от дата в PostgreSQL

  5. PostgreSQL отмяна на разрешения от pg_catalog таблици