sql >> Databáze >  >> RDS >> PostgreSQL

CHYBA:v Postgresu byla nalezena více než jedna vlastněná sekvence

Aktualizace: Tato chyba byla opravena v PostgreSQL v12 pomocí commitu 19781729f78 .
Zbytek odpovědi je relevantní pro starší verze.

serial sloupec má sekvenci, která je vlastněna sloupcem, a DEFAULT hodnota, která získá hodnotu čisté sekvence.

Pokud se pokusíte změnit tento sloupec na sloupec identity, zobrazí se chyba, že pro sloupec již existuje výchozí hodnota.

Nyní musíte vypustit výchozí hodnotu, ale ne sekvenci, která patří do serial sloupec. Poté, když jste sloupec převedli na sloupec identity, byla vytvořena druhá sekvence vlastněná tímto sloupcem.

Nyní, když se pokusíte vložit řádek, PostgreSQL se pokusí najít a použít the sekvence vlastněná sloupcem, ale jsou dva, proto se zobrazuje chybová zpráva.

Tvrdil bych, že se jedná o chybu v PostgreSQL:podle mého názoru měl buď přepracovat existující sekvenci pro sloupec identity, nebo vám dát chybu, že již existuje sekvence vlastněná tímto sloupcem, a měli byste ji vypustit. Pokusím se tuto chybu opravit .

Mezitím byste měli ručně vypustit sekvenci, která zůstala v serial sloupec. Spusťte následující dotaz:

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 by vám mělo poskytnout název sekvence, která zůstala v serial sloupec. Pusťte jej a sloupec identity by se měl chovat podle potřeby.



  1. PDO:Připojení k databázi na vzdáleném webu

  2. Jak vložit prvky pole do SQL propojeného s c++?

  3. Najít bod v polygonu PHP

  4. IntentService zamrzá uživatelské rozhraní mé aplikace