Postgres从序列中提取多个未来的密钥

时间:2011-10-11 23:41:16

标签: mysql postgresql indexing sequence

在Oracle中我可以做这样的事情来获取一堆密钥。

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

我Postgres有一个nextval函数,但是如何一次拉出多个值?`

如果有人也知道InnoDb的答案,我会很乐意阅读它。

2 个答案:

答案 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语句中,以确保竞争结果不会交错。如果您不关心连续值,则不需要锁定。