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 автоматично актуализира последователността за автоматично увеличение до най-голямата стойност на колоната, когато стойност се вмъкне ръчно в полето за автоматично увеличение.