PostgreSQL nextval 和 currval 在同一个查询中

Posted

技术标签:

【中文标题】PostgreSQL nextval 和 currval 在同一个查询中【英文标题】:PostgreSQL nextval and currval in same query 【发布时间】:2013-06-21 10:20:51 【问题描述】:

我希望调用一次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 OR 给出一个错误,即在当前会话中从未调用过 NEXTVAL。 [ 我知道错误发生的原因 :) ]

有没有办法在同一个 SQL 语句中使用 NEXTVALCURRVAL 来获得相同的递增值(在本例中为 11)以供重用?或者这个问题的简单解决方案?

【问题讨论】:

【参考方案1】:

一个可能的解决方案

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

【讨论】:

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

以上是关于PostgreSQL nextval 和 currval 在同一个查询中的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 3.2.14 / Ruby 2.0.0 / PostgreSQL 9.2.4 中使用 activerecord 从序列中检索 nextval

PostgreSQL中的自动增量列?

SQL Server:如何从 VIEW 中获取序列的 NEXTVAL?

Postgresql 错误:关系不存在

从 PostgreSQL 序列中选择多个 id

PostgreSQL设置主键自增重置主键自增从1开始