Nevím o žádném bezpečném a efektivním způsobu, jak dělat to, co chcete. Měli byste si opravdu vybrat, zda chcete klíče definovat sami, nebo použít vygenerované klíče a držet se jedné nebo druhé strategie.
Pokud vám nevadí strašná souběžnost, můžete LOCK TABLE thetable
, dělej svou práci, setval
sekvence identifikátorů tabulky na další volnou hodnotu po tom, co jste vložili, a commit
k uvolnění zámku. To však bude stále způsobovat problémy s aplikacemi, které explicitně volají nextval
(jako mnoho ORM), spíše než nechat databázi definovat hodnotu jejím vynecháním z ?INSERT
seznam sloupců nebo jej explicitně pojmenujte jako DEFAULT
.
Jinak byste mohli nechat svůj kód (nebo pomocnou funkci PL/PgSQL) vložit do opakovací smyčky, která inkrementuje klíč a zkusí to znovu, když dojde k chybě integrity. Tato strategie nebude fungovat, pokud potřebujete udělat více než jen jedno vložení na transakci. Dále v SERIALIZABLE
režim izolace Nemyslím si, že to můžete udělat s PL/PgSQL, musíte použít opakovací smyčku na straně klienta, abyste zvládli selhání serializace.
Je to hrozná představa. Buď používejte konzistentně klíče definované aplikací, nebo konzistentně klíče definované databází. Nesměšujte obojí.