Актуализация: Тази грешка е коригирана в PostgreSQL v12 с комит 19781729f78
.
Останалата част от отговора е подходяща за по-стари версии.
serial
колона има последователност, която е собственост на колоната и DEFAULT
стойност, която получава стойността на нетната последователност.
Ако се опитате да промените тази колона в колона за самоличност, ще получите грешка, че вече има стойност по подразбиране за колоната.
Сега трябва да сте изпуснали стойността по подразбиране, но не и последователността, която принадлежи към serial
колона. След това, когато преобразувахте колоната в колона за идентичност, беше създадена втора последователност, притежавана от колоната.
Сега, когато се опитате да вмъкнете ред, PostgreSQL се опитва да намери и използва the последователност, притежавана от колоната, но има две, оттук и съобщението за грешка.
Бих казал, че това е грешка в PostgreSQL:по мое мнение трябваше или да пренасочи съществуващата последователност за колоната за идентичност, или да ви даде грешка, че вече има последователност, притежавана от колоната, и трябва да я изпуснете. Ще се опитам да поправя тази грешка .
Междувременно трябва ръчно да премахнете последователността, останала от serial
колона. Изпълнете следната заявка:
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;
Това трябва да ви даде името на последователността, останала след serial
колона. Пуснете го и колоната за самоличност трябва да се държи както желаете.