Bijwerken: Deze bug is opgelost in PostgreSQL v12 met commit 19781729f78
.
De rest van het antwoord is relevant voor oudere versies.
Een serial
kolom heeft een reeks die eigendom is van de kolom en een DEFAULT
waarde die de netto reekswaarde krijgt.
Als u die kolom probeert te wijzigen in een identiteitskolom, krijgt u een foutmelding dat er al een standaardwaarde voor de kolom is.
Nu moet je de standaardwaarde hebben laten vallen, maar niet de reeks die bij de serial
hoort kolom. Toen u de kolom vervolgens in een identiteitskolom converteerde, werd een tweede reeks gemaakt die eigendom is van de kolom.
Wanneer u nu een rij probeert in te voegen, probeert PostgreSQL de . te vinden en te gebruiken reeks die eigendom is van de kolom, maar er zijn er twee, vandaar de foutmelding.
Ik zou beweren dat dit een bug is in PostgreSQL:naar mijn mening had het ofwel de bestaande reeks voor de identiteitskolom moeten herbestemmen of u een foutmelding moeten geven dat er al een reeks is die eigendom is van de kolom, en u zou deze moeten laten vallen. Ik zal proberen deze bug te verhelpen .
Ondertussen moet u de achtergebleven reeks handmatig verwijderen uit de serial
column.Voer de volgende zoekopdracht uit:
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;
Dat zou je de naam moeten geven van de reeks die is achtergelaten uit de serial
kolom. Laat het vallen en de identiteitskolom zou zich naar wens moeten gedragen.