【发布时间】:2011-12-05 17:38:11
【问题描述】:
在 Oracle 中,我可以执行类似的操作来获取一堆密钥。
select seq.nextval from dual connect by level <= 1000;
我postgres有一个nextval函数,但是如何一次拉取多个值呢?`
如果有人也知道 InnoDb 的答案,我会很乐意阅读。
【问题讨论】:
标签: mysql postgresql indexing sequence
在 Oracle 中,我可以执行类似的操作来获取一堆密钥。
select seq.nextval from dual connect by level <= 1000;
我postgres有一个nextval函数,但是如何一次拉取多个值呢?`
如果有人也知道 InnoDb 的答案,我会很乐意阅读。
【问题讨论】:
标签: mysql postgresql indexing sequence
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
【讨论】:
在 postgresql 中,你可以这样使用:
select nextval('mysequence') from generate_series(1,1000);
从序列中获取 1000 个值!不过,我认为假设这些将是连续值并不是特别安全。您可能需要将 select 包装在 lock 语句中,以确保竞争结果不会交错。如果你不关心连续值,那么你就不需要锁。
【讨论】:
generate(sequence, count),它总是返回序列中的连续值(实际上它返回最后生成的值,这取决于调用者插入中间值。)