PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

ERRORE:più di una sequenza posseduta trovata in Postgres

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.