PostgreSQL的函数用于获取最后插入的ID

465

在PostgreSQL中,我如何获得插入到表中的最后一个id?

在MS SQL中有SCOPE_IDENTITY()。

请不要建议我使用类似这样的东西:

select max(id) from table

1
你为什么讨厌max函数?我认为它非常简单。是否存在安全等问题? - jeongmin.cha
22
如果在其中有其他操作和更多插入(并发操作),意味着最大ID已经改变,除非你显式地锁定并且不释放它,否则会存在问题。 - rohanagarwal
1
如果预期使用情况是将最后插入的ID作为后续插入值的一部分使用,请参见此问题 - Flux
14个回答

3

Postgres内置了一个机制,可以在相同的查询中返回id或您想要查询返回的任何内容。

下面是一个示例。假设您已经创建了一个表,该表有2个列column1和column2,您想要在每次插入后返回column1:

# create table users_table(id serial not null primary key, name character varying);
CREATE TABLE
#insert into users_table(name) VALUES ('Jon Snow') RETURNING id;
 id 
----
  1
(1 row)

# insert into users_table(name) VALUES ('Arya Stark') RETURNING id;
 id 
----
  2
(1 row)

2

试试这个:

select nextval('my_seq_name');  // Returns next value

如果返回1(或者你的序列起始值),那么将序列重置为原始值,传递false标志:
select setval('my_seq_name', 1, false);

否则,
select setval('my_seq_name', nextValue - 1, true);

这将恢复序列值到原始状态,"setval"将返回您要查找的序列值。


0

-1

基于上面 @ooZman 的答案,在 PostgreSQL v12 中,当你需要插入下一个“序列”(类似于自动增量)的值而不会搞乱表格或计数器时,似乎可以这样做。(注意:我尚未在更复杂的数据库集群配置中测试过...)

伪代码

$insert_next_id = $return_result->query("select (setval('"your_id_seq"', (select nextval('"your_id_seq"')) - 1, true)) +1");

步长不保证为1,如果序列有任何并发使用,将会出现严重问题。 - Mike Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接