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í.