Aggiornamento: Questo bug è stato corretto in PostgreSQL v12 con commit 19781729f78
.
Il resto della risposta è rilevante per le versioni precedenti.
Un serial
colonna ha una sequenza di proprietà della colonna e un DEFAULT
valore che ottiene il valore della sequenza netta.
Se provi a cambiare quella colonna in una colonna di identità, riceverai un errore indicante che esiste già un valore predefinito per la colonna.
Ora devi aver eliminato il valore predefinito, ma non la sequenza che appartiene al serial
colonna. Quindi, quando hai convertito la colonna in una colonna di identità, è stata creata una seconda sequenza di proprietà della colonna.
Ora, quando provi a inserire una riga, PostgreSQL cerca di trovare e utilizzare il sequenza di proprietà della colonna, ma ce ne sono due, da cui il messaggio di errore.
Direi che questo è un bug in PostgreSQL:secondo me, avrebbe dovuto riproporre la sequenza esistente per la colonna identity o darti un errore che esiste già una sequenza di proprietà della colonna e dovresti eliminarla. Cercherò di risolvere questo bug .
Nel frattempo, dovresti eliminare manualmente la sequenza lasciata dal serial
column.Esegui la query seguente:
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;
Questo dovrebbe darti il nome della sequenza lasciata dal serial
colonna. Rilascialo e la colonna dell'identità dovrebbe comportarsi come desiderato.