在 PL/pgSQL 中 INSERT 后获取默认序列值

问题描述 投票:0回答:2

我有一张桌子。我在 plpgsql 中编写了一个函数,将一行插入到该表中:

INSERT INTO simpleTalbe (name,money) values('momo',1000) ;

此表有

serial
字段,称为
id
。我希望在插入行后在函数中知道新行收到的 id。

我想用:

select nextval('serial');

插入之前,有没有更好的解决方案?

postgresql plpgsql sql-insert sql-returning nextval
2个回答
4
投票

使用

RETURNING
子句。
并在 PL/pgSQL 中分配结果并附加
INTO

INSERT INTO simpleTalbe (name,money) values('momo',1000)
RETURNING id
INTO _my_id_variable;

_my_id_variable
必须使用匹配的数据类型进行声明。

相关:

根据您打算用它做什么,通常有更好的纯 SQL 解决方案。例子:


1
投票

select nextval('serial');
不会做你想做的事;
nextval()
实际上会递增序列,然后
INSERT
会再次递增它。(此外,“序列”不是您的 serial
 列使用的序列名称。)

@Erwin 的答案(

INSERT ... RETURNING

)是最好的答案,因为语法是专门针对这种情况引入的,但你也可以做一个

SELECT currval('simpletalbe_id_seq') INTO ...

之后的任何时间INSERT

检索序列的当前值。 (请注意支持 
serial 列的自动定义序列的序列名称格式 tablename_columnname
_seq。)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.