在同一查询中使用PostgreSQL的nextval和currval

4
我希望能够只调用 NEXTVAL 一次,并多次使用返回的值。然而,这种方法并不可行。
假设序列 seq_name 目前处于10(查询是独立执行的,不按照列表顺序执行):
SELECT NEXTVAL('seq_name'), NEXTVAL('seq_name');

上面的代码将会输出11,12(我只需要11和再次出现的11)。
SELECT NEXTVAL('seq_name'), CURRVAL('seq_name');
SELECT NEXTVAL('seq_name'), LASTVAL();

上述代码将会输出11或者10,NEXTVAL 在当前会话中从未被调用会导致错误。[我知道为什么会出现这个错误 :)]
有没有一种方法可以在同一个SQL语句中使用NEXTVALCURRVAL来获取相同的递增值(在这个例子中为11)以便重复使用?或者有简单的解决方案吗?
1个回答

6
一种可能的解决方案。
SELECT nextval nextval1, nextval nextval2
  FROM
(
  SELECT NEXTVAL('seq_name') nextval
) q

这里是一个 SQLFiddle 演示。

更新:如果要插入数据而不是使用 INSERT INTO ... VALUES,请使用 INSERT INTO ... SELECT

INSERT INTO Table1 (col1, col2, col3, col4, ...) 
SELECT nextval, nextval, 5, 'Text value', ...
  FROM
(
  SELECT NEXTVAL('seq_name') nextval
) q

1
如何使用 INSERT () VALUES () 语句结构?我需要用于插入语句,因此更通用的解决方案比较合适。您提供的解决方案过于特定于SELECT语句。 - ADTC
谢谢,回答很好,但是如果我真的_非常_ 非常 必须坚持使用INSERT VALUES结构怎么办? :D - ADTC
2
没有任何情况(至少我不知道)不能用INSERT SELECT替换INSERT VALUES :) - peterm
否则将其封装为一个过程并使用变量。 - peterm
你说得对,我同意。但这是一个挑战,不是吗? :) 顺便说一下,不要在SQLFiddle中尝试它...由于某种原因,在同一插入语句中使用NEXTVAL和CURRVAL返回相同的值(在我使用的数据库中不是这样的...也许是不同的版本?IDK...)。 - ADTC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接