在PostgreSQL中,如何将最后一个id插入到表中?

在MS SQL中有SCOPE_IDENTITY()。

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

select max(id) from table

当前回答

根据上面@ooZman的回答,这似乎适用于PostgreSQL v12,当你需要插入一个“序列”的下一个值时(类似于auto_increment),而不会在你的表(s)计数器中搞得很混乱。(注意:我还没有在更复杂的DB集群配置中测试它…)

Psuedo代码

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

其他回答

更好的方法是使用Insert和返回。虽然已经有了相同的答案,我只是想补充一下,如果你想把它保存到一个变量,那么你可以这样做

insert into my_table(name) returning id into _my_id;

你可以在插入查询后使用返回id。

INSERT INTO distributors (id, name) VALUES (DEFAULT, 'ALI') RETURNING id;

和结果:

 id 
----
  1

在上面的例子中,id是auto-increment field。

Postgres有一个内置的机制,可以在同一个查询中返回id或任何您希望查询返回的内容。 这里有一个例子。假设您创建了一个有两列columnn1和column2的表,并且希望在每次插入后返回columnn1。

# 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)

参见INSERT语句的RETURNING子句。基本上,INSERT可兼做查询,并返回插入的值。

其他答案没有显示如何使用return返回的值。下面是一个将返回值插入到另一个表的示例。

WITH inserted_id AS (
  INSERT INTO tbl1 (col1)
  VALUES ('foo') RETURNING id
)

INSERT INTO tbl2 (other_id) 
VALUES ((select id from inserted_id));