Не знам за безопасен и ефикасен начин да правите това, което искате. Наистина трябва да изберете дали искате сами да дефинирате ключовете или да използвате генерирани ключове и да се придържате към една или друга стратегия.
Ако нямате нищо против ужасната едновременност, можете да LOCK TABLE thetable
, върши си работата, setval
последователността на идентификатора на таблицата към следващата свободна стойност след това, което сте вмъкнали, и commit
за да освободите ключалката. Това обаче все още ще създава проблеми с приложения, които изрично извикват nextval
(като много ORM), вместо да позволи на базата данни да дефинира стойността, като я пропусне от ?INSERT
списък с колони или изрично именуване като DEFAULT
.
В противен случай можете да накарате вашия код (или помощна функция на PL/PgSQL) да направи вмъкването в цикъл за повторен опит, който увеличава ключа и опитва отново, когато получи грешка в целостта. Тази стратегия няма да работи, ако трябва да направите повече от едно вмъкване на транзакция. Освен това в SERIALIZABLE
режим на изолация Не мисля, че можете да го направите с PL/PgSQL, трябва да използвате цикъл за повторен опит от страна на клиента, за да се справите с грешките на сериализацията.
Това е ужасна идея. Използвайте последователно ключове, дефинирани от приложението, или последователно дефинирани от базата данни ключове. Не смесвайте двете.