在PostgreSQL中,如何将最后一个id插入到表中?
在MS SQL中有SCOPE_IDENTITY()。
请不要建议我使用这样的东西:
select max(id) from table
在PostgreSQL中,如何将最后一个id插入到表中?
在MS SQL中有SCOPE_IDENTITY()。
请不要建议我使用这样的东西:
select max(id) from table
当前回答
试试这个:
select nextval('my_seq_name'); // Returns next value
如果这个返回1(或者你的序列的start_value),那么将序列重置回原始值,传递false标志:
select setval('my_seq_name', 1, false);
否则,
select setval('my_seq_name', nextValue - 1, true);
这将把序列值恢复到原始状态,“setval”将返回您正在寻找的序列值。
其他回答
参见INSERT语句的RETURNING子句。基本上,INSERT可兼做查询,并返回插入的值。
根据上面@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语句中使用return子句,如下所示
wgzhao=# create table foo(id int,name text);
CREATE TABLE
wgzhao=# insert into foo values(1,'wgzhao') returning id;
id
----
1
(1 row)
INSERT 0 1
wgzhao=# insert into foo values(3,'wgzhao') returning id;
id
----
3
(1 row)
INSERT 0 1
wgzhao=# create table bar(id serial,name text);
CREATE TABLE
wgzhao=# insert into bar(name) values('wgzhao') returning id;
id
----
1
(1 row)
INSERT 0 1
wgzhao=# insert into bar(name) values('wgzhao') returning id;
id
----
2
(1 row)
INSERT 0
我在使用Java和Postgres时遇到了这个问题。 我通过更新一个新的Connector-J版本来解决这个问题。
postgresql - 9.2 - 1002. - jdbc4.jar
https://jdbc.postgresql.org/download.html: 版本42.2.12
https://jdbc.postgresql.org/download/postgresql-42.2.12.jar
试试这个:
select nextval('my_seq_name'); // Returns next value
如果这个返回1(或者你的序列的start_value),那么将序列重置回原始值,传递false标志:
select setval('my_seq_name', 1, false);
否则,
select setval('my_seq_name', nextValue - 1, true);
这将把序列值恢复到原始状态,“setval”将返回您正在寻找的序列值。