如何自动修复我的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)