如何自动修复我的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语句中使用并跳过第二个语句,那就更好了。

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

回答

你可以很容易地做到这一点:

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)


以上是如何自动修复我的Postgres序列?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>