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

Posted

技术标签:

【中文标题】在 PL/pgSQL 中插入后获取默认序列值【英文标题】:Get default serial value after INSERT inside PL/pgSQL 【发布时间】:2015-11-20 23:16:24 【问题描述】:

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

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

此表有 serial 字段,名为 id。我想在插入行后的函数中知道新行收到的 id。

我想用:

select nextval('serial');

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

【问题讨论】:

postgresql.org/docs/current/static/sql-insert.html 看底部insert returning 【参考方案1】:

使用RETURNING 子句。您需要将结果保存在 PL/pgSQL 中的某处 - 并附加 INTO ..

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

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

相关:

PostgreSQL next value of the sequences?

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

Combining INSERT statements in a data-modifying CTE with a CASE expression PostgreSQL multi INSERT...RETURNING with multiple columns

【讨论】:

【参考方案2】:

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

@Erwin 的答案 (INSERT ... RETURNING) 是最好的答案,因为专门针对这种情况引入了语法,但您也可以这样做

SELECT currval('simpletalbe_id_seq') INTO ...

任何时间之后你的INSERT 来检索序列的当前值。 (注意支持serial 列的自动定义序列的序列名称格式tablename_columnname_seq。)

【讨论】:

以上是关于在 PL/pgSQL 中插入后获取默认序列值的主要内容,如果未能解决你的问题,请参考以下文章

关于 Pl/pgsql 中游标的一些错误

如何使用 pl/pgsql 将具有动态元素名称的 JSON 数据转换为行?

PL/pgSQL:删除(更新)与记录匹配的行

Pl/Pgsql,将数组参数传递给 INSERT

在 PL/pgSQL 块中运行 SELECT

PostgreSQL 提高 PL/pgSQL 函数的性能