Uppdatering: Det här felet har åtgärdats i PostgreSQL v12 med commit 19781729f78
.
Resten av svaret är relevant för äldre versioner.
En serial
kolumnen har en sekvens som ägs av kolumnen och en DEFAULT
värde som får nettosekvensvärdet.
Om du försöker ändra den kolumnen till en identitetskolumn får du ett felmeddelande om att det redan finns ett standardvärde för kolumnen.
Nu måste du ha tappat standardvärdet, men inte sekvensen som hör till serial
kolumn. När du sedan konverterade kolumnen till en identitetskolumn skapades en andra sekvens som ägs av kolumnen.
När du nu försöker infoga en rad försöker PostgreSQL hitta och använda den sekvens som ägs av kolumnen, men det finns två, därav felmeddelandet.
Jag skulle hävda att detta är en bugg i PostgreSQL:enligt min åsikt borde den antingen ha ändrat den befintliga sekvensen för identitetskolumnen eller gett dig ett felmeddelande om att det redan finns en sekvens som ägs av kolumnen, och du borde släppa den. Jag ska försöka fixa detta fel .
Under tiden bör du manuellt släppa sekvensen som lämnas kvar från serial
kolumn. Kör följande fråga:
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;
Det bör ge dig namnet på sekvensen som lämnas kvar från serial
kolumn. Släpp den och identitetskolumnen ska fungera som önskat.