Postgres извлекает несколько ключей будущего из последовательности - PullRequest
1 голос
/ 12 октября 2011

В Oracle я могу сделать что-то вроде этого, чтобы получить кучу ключей.

select seq.nextval from dual connect by level <= 1000;

I Postgres есть функция nextval, но как можно извлечь несколько значений одновременно? `

Если кто-то также знает ответ для InnoDb, я был бы рад прочитать его.

Ответы [ 2 ]

2 голосов
/ 12 октября 2011

PostgreSQL имеет набор функций, которые управляют последовательностями .Таким образом, вы можете сделать что-то вроде этого.(Но не делайте этого. См. «Используйте собственный кеш PostgreSQL» ниже.)

drop sequence test;
create sequence test;

-- You'll want to wrap these in a single transaction.
select nextval('test');                               -- Returns 1
select (setval('test', currval('test') + 1000)) as t; -- Returns 1001
select nextval('test');                               -- Returns 1002

Есть несколько других способов получить набор значений из последовательности.См. Документы для CREATE SEQUENCE .

Увеличьте последовательность на 1000, а не на 1. Пусть ваше приложение обработает тысячи значений ниже, чем nextval ().Вы, вероятно, в конечном итоге выбросите много чисел.

drop sequence test;
create sequence test increment by 1000;
select nextval('test'); -- Returns 1; do this when you create the sequence.
select nextval('test'); -- Returns 1001

Используйте собственный кеш PostgreSQL .Я почти уверен, что это будет самый надежный и надежный подход.

drop sequence test;
create sequence test cache 1000;
select nextval('test'); -- Returns 1.
select nextval('test'); -- Returns 2 from the cache; doesn't touch the sequence.

Другой параллельный сеанс не увидит того же.

select nextval('test'); -- Returns 1001
1 голос
/ 12 октября 2011

В postgresql вы можете использовать что-то вроде этого:

select nextval('mysequence') from generate_series(1,1000);

чтобы получить 1000 значений из последовательности! Я не думаю, что особенно безопасно предполагать, что это будут последовательные значения. Возможно, вам придется заключить select в оператор блокировки, чтобы убедиться, что конкурирующие результаты не чередуются. Если вам не нужны последовательные значения, блокировка вам не нужна.

...