【问题标题】:Postgres pull multiple future keys from sequencePostgres 从序列中提取多个未来键
【发布时间】:2011-12-05 17:38:11
【问题描述】:

在 Oracle 中,我可以执行类似的操作来获取一堆密钥。

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

我postgres有一个nextval函数,但是如何一次拉取多个值呢?`

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

【问题讨论】:

    标签: mysql postgresql indexing sequence


    【解决方案1】:

    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
    

    【讨论】:

    • 是 + 1000 的例子,告诉我在 1 到 1001 之间没有其他交易有任何密钥?
    • @FranzKafka:是的,但我认为使用本机缓存是一个更好的主意。请参阅我的更新答案。
    【解决方案2】:

    在 postgresql 中,你可以这样使用:

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

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

    【讨论】:

    • 我只需要 1000 个值,这是其他交易永远无法获得的。如果他们去 1,5,9,12,13,14,150 我不在乎。这就是您所说的“连续值”吗? p.s 我正在执行已提交的读取操作。
    • 是的。如果您不关心差距,那么就是这样。我不确定您的 oracle 示例有什么不同,但首先出现在我脑海中的是 firebird 的 generate(sequence, count),它总是返回序列中的连续值(实际上它返回最后生成的值,这取决于调用者插入中间值。)
    • 完美,这就是我所需要的。不知道火鸟的时代是不是已经到了。也许几年后我会搬到火鸟。我很高兴首先将应用程序移植到 postgres。 ps oracle 也是一样的:它不保证无间隙序列。
    • mnnneh...我想不出任何理由,尽管有原生的连续序列读取,但任何事情都支持 firebird。 PostgreSQL 获得了更多的开发关注,拥有非常出色的文档,并且拥有许多 firebird 可能永远不会拥有的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 2021-09-17
    • 2018-12-06
    • 2019-11-20
    • 2017-09-06
    • 2019-02-05
    • 2016-12-24
    相关资源
    最近更新 更多