Aktualizace: Tato chyba byla opravena v PostgreSQL v12 pomocí commitu 19781729f78
.
Zbytek odpovědi je relevantní pro starší verze.
serial
sloupec má sekvenci, která je vlastněna sloupcem, a DEFAULT
hodnota, která získá hodnotu čisté sekvence.
Pokud se pokusíte změnit tento sloupec na sloupec identity, zobrazí se chyba, že pro sloupec již existuje výchozí hodnota.
Nyní musíte vypustit výchozí hodnotu, ale ne sekvenci, která patří do serial
sloupec. Poté, když jste sloupec převedli na sloupec identity, byla vytvořena druhá sekvence vlastněná tímto sloupcem.
Nyní, když se pokusíte vložit řádek, PostgreSQL se pokusí najít a použít the sekvence vlastněná sloupcem, ale jsou dva, proto se zobrazuje chybová zpráva.
Tvrdil bych, že se jedná o chybu v PostgreSQL:podle mého názoru měl buď přepracovat existující sekvenci pro sloupec identity, nebo vám dát chybu, že již existuje sekvence vlastněná tímto sloupcem, a měli byste ji vypustit. Pokusím se tuto chybu opravit .
Mezitím byste měli ručně vypustit sekvenci, která zůstala v serial
sloupec. Spusťte následující dotaz:
SELECT d.objid::regclass
FROM pg_depend AS d
JOIN pg_attribute AS a ON d.refobjid = a.attrelid AND
d.refobjsubid = a.attnum
WHERE d.classid = 'pg_class'::regclass
AND d.refclassid = 'pg_class'::regclass
AND d.deptype <> 'i'
AND a.attname = 'patientid'
AND d.refobjid = 'patient'::regclass;
To by vám mělo poskytnout název sekvence, která zůstala v serial
sloupec. Pusťte jej a sloupec identity by se měl chovat podle potřeby.