Postgres zpracovává automatické zvyšování trochu jinak než MySQL. V Postgresu, když vytvoříte serial
pole, vytváříte také sekvenční pole, které sleduje id k použití. Toto pole sekvence bude začínat hodnotou 1.
Když do tabulky vložíte nový záznam, pokud nezadáte id
pole, použije hodnotu sekvence a poté sekvenci zvýší. Pokud však zadáte id
pole, pak se sekvence nepoužívá a ani se neaktualizuje.
Předpokládám, že když jste přešli na Postgres, nasadili jste nebo importovali některé stávající uživatele spolu s jejich stávajícími ID. Když jste vytvořili tyto uživatelské záznamy s jejich ID, sekvence nebyla použita, a proto nebyla nikdy aktualizována.
Takže pokud jste například importovali 10 uživatelů, máte uživatele s ID 1-10, ale vaše sekvence je stále na 1. Když se pokusíte vytvořit nového uživatele bez zadání id, stáhne hodnotu ze sekvence ( 1) a získáte jedinečné porušení, protože již máte uživatele s ID 1.
Chcete-li problém vyřešit, musíte nastavit users_id_seq
sekvenční hodnotu na MAX(id) vašich stávajících uživatelů. Můžete si přečíst tuto otázku/odpověď pro více informací o resetování sekvence, ale můžete také zkusit něco jako (netestováno):
SELECT setval(pg_get_serial_sequence('users', 'id'), coalesce(max(id)+1, 1), false) FROM users;
Pro informaci, toto není problém v MySQL, protože MySQL automaticky aktualizuje sekvenci automatického přírůstku na hodnotu největšího sloupce, když je hodnota ručně vložena do pole automatického přírůstku.