在Oracle中我可以做这样的事情来获取一堆密钥。
select seq.nextval from dual connect by level <= 1000;
我Postgres有一个nextval函数,但是如何一次拉出多个值?`
如果有人也知道InnoDb的答案,我会很乐意阅读它。
答案 0 :(得分:2)
PostgreSQL有一套functions that manipulate sequences。所以你可以做这样的事情。 (但请不要。请参阅下面的“使用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 :(得分:1)
在postgresql中,您可以使用以下内容:
select nextval('mysequence') from generate_series(1,1000);
从序列中获取1000个值!不过,我认为假设这些是连续值是不安全的。您可能需要将select
包装在lock语句中,以确保竞争结果不会交错。如果您不关心连续值,则不需要锁定。