从PostgreSQL序列中选择多个ID

时间:2009-05-22 03:47:33

标签: postgresql select nextval

是否有简洁的方法在1个查询中多次为PostgreSQL序列选择nextval?这将是唯一返回的值。

例如,我想做一些非常短暂和甜蜜的事情:

SELECT NEXTVAL('mytable_seq', 3) AS id;

得到:

 id  
-----
 118
 119
 120
(3 rows)

5 个答案:

答案 0 :(得分:43)

select nextval('mytable_seq') from generate_series(1,3);

generate_series是一个函数,它返回许多带有序号的行,由它的参数配置。

在上面的例子中,我们不关心每一行的值,我们只使用generate_series作为行生成器。对于每一行,我们都可以调用nextval。在这种情况下,它返回3个数字(下一个)。

你可以将它包装成函数,但我不确定它是否真的合理,因为查询有多短。

答案 1 :(得分:12)

有一篇关于这个确切问题的精彩文章:“getting multiple values from sequences”。

如果性能不是问题,例如当使用序列值dwarfs时,用于获取它们的时间或 n 很小,那么 SELECT nextval('seq')FROM generate_series (1,n)方法是最简单和最合适的。

但是在为批量加载准备数据时,从锁定中通过 n 递增序列的文章中的最后一种方法是合适的。

答案 2 :(得分:1)


CREATE OR REPLACE FUNCTION foo() RETURNS SETOF INT AS $$
DECLARE
    seqval int; x int;
BEGIN
x := 0;

WHILE x < 100 LOOP
    SELECT into seqval nextval('f_id_seq');
    RETURN NEXT seqval;
    x := x+1;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql STRICT;

当然,如果您要做的就是推进序列,那就是setval()

您还可以让函数获取循环次数的参数:

CREATE OR REPLACE FUNCTION foo(loopcnt int) RETURNS SETOF INT AS $$
DECLARE
    seqval int;       
    x int;
BEGIN
x := 0;
WHILE x < loopcnt LOOP
    SELECT into seqval nextval('f_id_seq');
    RETURN NEXT seqval;x := x+1;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql STRICT;

答案 3 :(得分:0)

我目前最好的解决方案是:

SELECT NEXTVAL('mytable_seq') AS id
UNION ALL
SELECT NEXTVAL('mytable_seq') AS id
UNION ALL
SELECT NEXTVAL('mytable_seq') AS id;

哪个会正确返回3行...但我想要的东西是最小的SQL,即使多达100个或更多的NEXTVAL调用。

答案 4 :(得分:0)

除非你真的想要返回三行,否则我会为每个选择将序列设置为'INCREMENT BY 3'。然后你可以简单地将1和2添加到结果中,得到你的三个序列号。

我尝试添加一个指向postgresql文档的链接,但很明显我不允许发布链接。