sql >> Databasteknik >  >> RDS >> PostgreSQL

FEL:mer än en ägd sekvens hittades i Postgres

Uppdatering: Det här felet har åtgärdats i PostgreSQL v12 med commit 19781729f78 .
Resten av svaret är relevant för äldre versioner.

En serial kolumnen har en sekvens som ägs av kolumnen och en DEFAULT värde som får nettosekvensvärdet.

Om du försöker ändra den kolumnen till en identitetskolumn får du ett felmeddelande om att det redan finns ett standardvärde för kolumnen.

Nu måste du ha tappat standardvärdet, men inte sekvensen som hör till serial kolumn. När du sedan konverterade kolumnen till en identitetskolumn skapades en andra sekvens som ägs av kolumnen.

När du nu försöker infoga en rad försöker PostgreSQL hitta och använda den sekvens som ägs av kolumnen, men det finns två, därav felmeddelandet.

Jag skulle hävda att detta är en bugg i PostgreSQL:enligt min åsikt borde den antingen ha ändrat den befintliga sekvensen för identitetskolumnen eller gett dig ett felmeddelande om att det redan finns en sekvens som ägs av kolumnen, och du borde släppa den. Jag ska försöka fixa detta fel .

Under tiden bör du manuellt släppa sekvensen som lämnas kvar från serial kolumn. Kör följande fråga:

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;

Det bör ge dig namnet på sekvensen som lämnas kvar från serial kolumn. Släpp den och identitetskolumnen ska fungera som önskat.



  1. Ta reda på om en kolumn i Oracle har en sekvens

  2. Allvarligt fel påträffades under dataläsning

  3. Lösning för att infoga avsiktslås i MySQL

  4. Hur man använder DISTINCT i SQL