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

FEJL:mere end én ejet sekvens fundet i Postgres

Opdatering: Denne fejl er blevet rettet i PostgreSQL v12 med commit f802025555400000000000000000000000000000000000000000000000000000000000200255 19781729f78 .
Resten af ​​svaret er relevant for ældre versioner.

En serial kolonnen har en sekvens, der ejes af kolonnen, og en DEFAULT værdi, der får nettosekvensværdien.

Hvis du forsøger at ændre den kolonne til en identitetskolonne, får du en fejlmeddelelse om, at der allerede er en standardværdi for kolonnen.

Nu skal du have droppet standardværdien, men ikke sekvensen, der hører til serial kolonne. Når du derefter konverterede kolonnen til en identitetskolonne, blev der oprettet en anden sekvens, der ejes af kolonnen.

Når du nu prøver at indsætte en række, forsøger PostgreSQL at finde og bruge den sekvens, der ejes af kolonnen, men der er to, deraf fejlmeddelelsen.

Jeg vil hævde, at dette er en fejl i PostgreSQL:efter min mening burde den enten have genbrugt den eksisterende sekvens for identitetskolonnen eller givet dig en fejl om, at der allerede er en sekvens, der ejes af kolonnen, og du bør droppe den. Jeg vil prøve at få rettet denne fejl .

I mellemtiden bør du manuelt slippe sekvensen efterladt fra serial kolonne. Kør følgende forespørgsel:

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 skulle give dig navnet på den sekvens, der er efterladt fra serial kolonne. Slip det, og identitetskolonnen skulle opføre sig som ønsket.



  1. Sådan hentes data med to kolonner i A,B-format i Oracle

  2. Ufølsomme søgninger/forespørgsler

  3. Opbygning af ternære forhold ved hjælp af Laravel Eloquent Relationships

  4. Parse &Sammenlign data ved hjælp af Coldfusion &MySQL