如何在PostgreSQL中使用RETURNING子句?

4

我正在使用 PostgreSQL 8.2(应该是支持 RETURNING 的最低版本),确切地说是在 GNU/Linux 上的 8.2.19 版本。我尝试在自动插入的列上使用 returning 子句,该列也作为主键进行了约束。新行的插入已正确完成,但返回的结果为空(在 pgAdmin 中的查询执行器中验证)。我尝试了隐式插入,并为主键列指定了 DEFAULT。

我尝试返回的列定义如下:

al_id integer NOT NULL DEFAULT nextval(('"allarmi_al_id_seq"'::text)::regclass)

插入查询的语法如下

INSERT INTO alarms (al_id, al_descr) 
     VALUES (DEFAULT, 'description') 
  RETURNING al_id;

allarmi_al_id_seq 显然是一个序列,并被定义为

CREATE SEQUENCE allarmi_al_id_seq
    INCREMENT 1
    MINVALUE 1
    MAXVALUE 9223372036854775807
    START 34564230
    CACHE 1;

有什么问题吗?


看起来在8.3.20版本中可以工作 - http://sqlfiddle.com/#!10/309b9/1。这两个版本之间应该有一些修复 :) - Roman Pekar
你尝试过不显式指定al_id吗?http://sqlfiddle.com/#!10/309b9/4 - Clodoaldo Neto
是的,我指的就是那种风格,称之为“隐式插入”。 - Ufo.rob
这段代码是否有效:INSERT INTO alarms (al_descr) VALUES ('description') RETURNING al_id; - Luc M
1个回答

2
您也可以显式地读取当前序列的值并返回它:
INSERT INTO alarms (al_id, al_descr) 
     VALUES (DEFAULT, 'description') 
  RETURNING currval('allarmi_al_id_seq') AS al_id;

请注意,currval函数返回会话中最近获取的值,因此没有并发问题(除非您有一个触发器导致序列递增)。


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