Mir ist keine sichere und effiziente Möglichkeit bekannt, das zu tun, was Sie wollen. Sie sollten wirklich wählen, ob Sie die Schlüssel selbst definieren oder generierte Schlüssel verwenden und bei der einen oder anderen Strategie bleiben möchten.
Wenn Sie nichts gegen schreckliche Parallelität haben, können Sie LOCK TABLE thetable
, mach deine Arbeit, setval
die Bezeichnersequenz der Tabelle zum nächsten freien Wert nach dem, was Sie eingefügt haben, und commit
um die Sperre zu lösen. Dies führt jedoch immer noch zu Problemen mit Apps, die explizit nextval
aufrufen (wie viele ORMs), anstatt die Datenbank den Wert definieren zu lassen, indem sie ihn aus dem ?INSERT
weglässt Spaltenliste oder explizit als DEFAULT
benennen .
Andernfalls könnten Sie Ihren Code (oder eine PL/PgSQL-Hilfsfunktion) die Einfügung in einer Wiederholungsschleife ausführen lassen, die den Schlüssel erhöht und es erneut versucht, wenn ein Integritätsfehler auftritt. Diese Strategie funktioniert nicht, wenn Sie mehr als nur eine Einfügung pro Transaktion durchführen müssen. Außerdem in SERIALIZABLE
Isolationsmodus Ich glaube nicht, dass Sie dies mit PL/PgSQL tun können, Sie müssen eine clientseitige Wiederholungsschleife verwenden, um Serialisierungsfehler zu behandeln.
Es ist eine schreckliche Idee. Verwenden Sie entweder konsistent anwendungsdefinierte Schlüssel oder konsistent datenbankdefinierte Schlüssel. Mischen Sie die beiden nicht.