Mysql Postgres从序列中提取多个未来键

Mysql Postgres从序列中提取多个未来键,mysql,postgresql,indexing,sequence,Mysql,Postgresql,Indexing,Sequence,在甲骨文中,我可以做这样的事情来取一堆钥匙 在postgresql中,从dual connect by level中选择seq.nextval,您可以使用如下内容: select nextval('mysequence') from generate_series(1,1000); 从序列中获取1000个值!不过,我认为假设这些值是连续的并不特别安全。您可能需要将select包装在lock语句中,以确保竞争结果不会交错。如果您不关心连续值,那么就不需要锁。PostgreSQL有一套。所以你可以

在甲骨文中,我可以做这样的事情来取一堆钥匙


在postgresql中,从dual connect by level中选择seq.nextval,您可以使用如下内容:

select nextval('mysequence') from generate_series(1,1000);
从序列中获取1000个值!不过,我认为假设这些值是连续的并不特别安全。您可能需要将
select
包装在lock语句中,以确保竞争结果不会交错。如果您不关心连续值,那么就不需要锁。

PostgreSQL有一套。所以你可以这样做。(但不要这样做。请参阅下面的“使用PostgreSQL的本机缓存”。)

有两种其他方法可以从序列中获取一组值。有关详细信息,请参阅文档

让序列增量为1000,而不是1。让您的应用程序处理分配低于nextval()的1000个值。你可能会丢掉很多数字

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

我只需要1000个值,其他任何事务都无法获得。如果他们去1,5,9,12,13,14150我不在乎。这就是你所说的“连续值”吗?p、 是的,我正在跑步。如果你不在乎差距,那么这就是它。我不确定您的oracle示例是否有任何不同,但我想到的第一件事是firebird的
generate(sequence,count)
,它总是返回序列外的连续值(实际上它返回最后生成的值,由调用方插入插入的值)。完美,这就是我所需要的。我不知道火鸟的时间是否已经到了。也许几年后我会搬到firebird。我很高兴首先将应用程序移植到postgres。p、 s的oracle是一样的:它不保证无间隙序列。。。我想不出任何理由,尽管本地连续序列读取,支持firebird做任何事情。PostgreSQL得到了更多的开发关注,拥有非常出色的文档处理能力,并且拥有firebird可能永远不会拥有的一堆功能。有+1000的例子告诉我在1到1001之间没有其他事务获得任何密钥吗?@FranzKafka:是的,但我认为使用本机缓存是一个更好的主意。请参阅我的最新答案。
select nextval('test'); -- Returns 1001