在 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 中插入后获取默认序列值的主要内容,如果未能解决你的问题,请参考以下文章