Poderia funcionar assim:
-- DROP SCHEMA x CASCADE;
CREATE SCHEMA x;
CREATE TABLE x.priv_id(seq_id int primary key, id int);
INSERT INTO x.priv_id
SELECT generate_series(1,100,1), (random() * 1000)::int;
CREATE SEQUENCE x.priv_seq;
SELECT id
FROM x.priv_id
WHERE seq_id = (SELECT nextval('x.priv_seq'));
Pontos principais:
1) Crie uma tabela de pesquisa com dois números
-
seq_id
está contando a partir de 1 e sua chave primária.-
id
são seus números em sequência (eu substituí por números aleatórios aqui).2) Crie uma sequência auxiliar.
3) Obtenha seus números com um SELECT como acima.
Você precisa da subseleção, ou todos os valores serão devolvidos de uma só vez.
Esta solução oferece toda a segurança nextval() tem a oferecer para simultaneidade.
Crie um índice exclusivo em priv_id(id) se quiser garantir que seus ids personalizados sejam únicos.