Aktualizacja: Ten błąd został naprawiony w PostgreSQL v12 za pomocą zatwierdzenia 19781729f78
.
Reszta odpowiedzi dotyczy starszych wersji.
serial
kolumna ma sekwencję, której właścicielem jest kolumna i DEFAULT
wartość, która otrzymuje wartość sekwencji netto.
Jeśli spróbujesz zmienić tę kolumnę na kolumnę tożsamości, otrzymasz błąd, że istnieje już wartość domyślna dla tej kolumny.
Teraz musiałeś usunąć domyślną wartość, ale nie sekwencję należącą do serial
kolumna. Następnie, po przekształceniu kolumny w kolumnę tożsamości, utworzona została druga sekwencja należąca do tej kolumny.
Teraz, gdy próbujesz wstawić wiersz, PostgreSQL próbuje znaleźć i użyć sekwencja należąca do kolumny, ale są dwie, stąd komunikat o błędzie.
Twierdzę, że jest to błąd w PostgreSQL:moim zdaniem powinien albo zmienić istniejącą sekwencję dla kolumny tożsamości, albo dać ci błąd, że istnieje już sekwencja należąca do kolumny i powinieneś ją usunąć. Postaram się naprawić ten błąd .
W międzyczasie powinieneś ręcznie usunąć sekwencję pozostawioną z serial
column.Uruchom następujące zapytanie:
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 powinno dać ci nazwę sekwencji pozostawionej po serial
kolumna. Upuść go, a kolumna tożsamości powinna zachowywać się zgodnie z oczekiwaniami.