Opdatering: Denne fejl er blevet rettet i PostgreSQL v12 med commit f802025555400000000000000000000000000000000000000000000000000000000000200255 19781729f78
.
Resten af svaret er relevant for ældre versioner.
En serial
kolonnen har en sekvens, der ejes af kolonnen, og en DEFAULT
værdi, der får nettosekvensværdien.
Hvis du forsøger at ændre den kolonne til en identitetskolonne, får du en fejlmeddelelse om, at der allerede er en standardværdi for kolonnen.
Nu skal du have droppet standardværdien, men ikke sekvensen, der hører til serial
kolonne. Når du derefter konverterede kolonnen til en identitetskolonne, blev der oprettet en anden sekvens, der ejes af kolonnen.
Når du nu prøver at indsætte en række, forsøger PostgreSQL at finde og bruge den sekvens, der ejes af kolonnen, men der er to, deraf fejlmeddelelsen.
Jeg vil hævde, at dette er en fejl i PostgreSQL:efter min mening burde den enten have genbrugt den eksisterende sekvens for identitetskolonnen eller givet dig en fejl om, at der allerede er en sekvens, der ejes af kolonnen, og du bør droppe den. Jeg vil prøve at få rettet denne fejl .
I mellemtiden bør du manuelt slippe sekvensen efterladt fra serial
kolonne. Kør følgende forespørgsel:
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 skulle give dig navnet på den sekvens, der er efterladt fra serial
kolonne. Slip det, og identitetskolonnen skulle opføre sig som ønsket.