我正在使用PostgreSQL 8.2(它应该是支持RETURNING的最低版本),正是在GNU / Linux上的8.2.19。我试图在自动插入的列上使用returns子句,该列也被约束为主键。正确完成了新行的插入,但返回的结果为空(使用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;
怎么了?
答案 0 :(得分:2)
您还可以显式读取序列的当前值并返回:
INSERT INTO alarms (al_id, al_descr)
VALUES (DEFAULT, 'description')
RETURNING currval('allarmi_al_id_seq') AS al_id;
请注意,currval函数返回此会话中最近获得的值,因此没有并发问题(除非您有一个触发器导致序列递增)。