Вы не можете ожидать, что в последовательном столбце не будет дыр.
Вы можете реализовать ключ без зазора, пожертвовав параллелизмом так:
create table registry_last_id (value int not null);
insert into registry_last_id values (-1);
create function next_registry_id() returns int language sql volatile
as $$
update registry_last_id set value=value+1 returning value
$$;
create table registry ( id int primary key default next_registry_id(), ... )
Но любая транзакция, которая пытается вставить что-то в таблицу registry
, будет блокироваться, пока другая транзакция вставки не завершит свою работу и не запишет свои данные на диск. Это позволит вам не более 125 вставок транзакций в секунду на диск со скоростью 7500 об / мин.
Также любое удаление из таблицы registry
создаст пробел.
Это решение основано на статье Последовательности без промежутков для первичных ключей А. Элейн Мустейн, которая несколько устарела.