sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:Unikátní porušení:7 CHYBA:duplicitní hodnota klíče porušuje jedinečné omezení users_pkey

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.



  1. Jak nasadit produkční cluster MySQL nebo MariaDB Galera pomocí ClusterControl

  2. Jak mohu dotazovat hodnotu ve sloupci SQL Server XML

  3. Jak vytvořit jednoduchý výběrový dotaz v návrhovém zobrazení v Accessu 2016

  4. Jak opravit dvojitě zakódované znaky UTF8 (v tabulce utf-8)