首页 > 解决方案 > 如何自动修复我的 Postgres 序列?

问题描述

我想更新 Postgres 中的序列,我可以半手动完成,如下所示:

SELECT MAX(id) as highest_id FROM users;
ALTER SEQUENCE users_id_seq RESTART WITH 11071;

在这种情况下,我必须获取第一个查询的结果,结果是11070,并将其插入到下一个查询中,增加1. 我宁愿有一个查询可以一举完成所有这些。

如果可行,“两次猛扑”方法将是这样,但这失败了:

ALTER SEQUENCE users_id_seq RESTART WITH (SELECT MAX(id) as highest_id FROM users);
ALTER SEQUENCE users_id_seq INCREMENT BY 1;

+ 1如果我可以在第一个ALTER SEQUENCE语句中使用并跳过第二个语句,那就更好了。

有什么办法可以解决这个问题吗?(两个步骤或一个步骤,但无需我手动干预。)

标签: postgresql

解决方案


您可以通过以下方式轻松做到这一点:

SELECT setval('users_id_seq',(SELECT max(id) FROM users));

这会将序列设置为当前值,因此当您调用 时nextval(),您将获得下一个:

edb=# create table foo (id serial primary key, name text);
CREATE TABLE
edb=# insert into foo values (generate_series(1,10000),'johndoe');
INSERT 0 10000
edb=# select * from foo_id_seq ;
 last_value | log_cnt | is_called 
------------+---------+-----------
          1 |       0 | f
(1 row)

edb=# select setval('foo_id_seq',(SELECT max(id) FROM foo));
 setval 
--------
  10000
(1 row)

edb=# select * from foo_id_seq ;
 last_value | log_cnt | is_called 
------------+---------+-----------
      10000 |       0 | t
(1 row)

edb=# insert into foo values (default,'bob');
INSERT 0 1
edb=# select * from foo order by id desc limit 1;
  id   | name 
-------+------
 10001 | bob
(1 row)

推荐阅读