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.