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

Get default serial value after INSERT inside PL/pgSQL

我有一个table。我在 plpgsql 中写了一个函数,它在 table:

中插入一行
INSERT INTO simpleTalbe (name,money) values('momo',1000) ;

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

我想用:

select nextval('serial');

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

使用 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 通常有更好的解决方案。示例:

  • PostgreSQL multi INSERT...RETURNING with multiple columns

select nextval('serial');不会如你所愿; nextval() 实际上是递增序列,然后 INSERT 会再次递增它 (此外,'serial' 是 而不是 您的 serial 列使用的序列名称。)

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

SELECT currval('simpletalbe_id_seq') INTO ...

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