是否有简洁的方法在1个查询中多次为PostgreSQL序列选择nextval?这将是唯一返回的值。
例如,我想做一些非常短暂和甜蜜的事情:
SELECT NEXTVAL('mytable_seq', 3) AS id;
得到:
id
-----
118
119
120
(3 rows)
答案 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文档的链接,但很明显我不允许发布链接。