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

Aktualizujte sekvenci na řádku INSERT

To je známé omezení:sekvence jsou inkrementovány během volání nextval() funkce, což je výchozí hodnota vašeho pole. Když zadáte data na INSERT do tohoto pole se výraz výchozí hodnoty nevyhodnocuje, proto se neovlivní hodnota sekvence.

Řešením je nastavit spouštěč před/po INSERT ručně opravit hodnotu sekvence pomocí setval() . Ale tímto způsobem byste měli potřeba nastavit spouštěč na UPDATE i v tomto poli, abyste opravili hodnotu sekvence, když jen aktualizujete některé existující id na vyšší id.

Dalším řešením je, že napíšete uloženou funkci, která může vytvořit dostupnou hodnotu pro toto pole a nastavit výchozí hodnotu pole na návratovou hodnotu této funkce. Něco jako:

LOOP
    result = nextval('my_id_seq');
    EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;

Ale pozor:výchozí funkce pro sekvence je bezpečná pro souběžné inserty (aktuální stav sekvence je globální - nezávislý na transakci). Pokud do těchto polí zadáte explicitní hodnoty, nebude tomu tak.




  1. Pole v datovém souboru překračuje maximální délku - chyba

  2. 2 způsoby, jak odstranit duplicitní řádky v Oracle

  3. Ladění funkce PostgreSQL pomocí pgAdmin

  4. PostgreSQL při objednávání ignoruje pomlčky