首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何自动修复Postgres序列?

如何自动修复Postgres序列?
EN

Stack Overflow用户
提问于 2021-01-06 04:26:04
回答 1查看 194关注 0票数 1

我想更新Postgres中的序列,我可以用半手动方式进行,如下所示:

代码语言:javascript
复制
SELECT MAX(id) as highest_id FROM users;
ALTER SEQUENCE users_id_seq RESTART WITH 11071;

在本例中,我必须将第一个查询的结果(结果为11070 )插入到下一个查询中,由1递增。我宁愿只需要一个查询就可以一举完成所有这些。

如果成功的话,“两次俯冲”的方法会是这样的,但这是失败的:

代码语言:javascript
复制
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语句并跳过第二个语句,那就更好了。

有什么办法能解决这个问题吗?(不是两步就是一步,但没有我的人工干预。)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-06 04:50:22

您可以很容易地通过以下方法完成这一任务:

代码语言:javascript
复制
SELECT setval('users_id_seq',(SELECT max(id) FROM users));

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

代码语言:javascript
复制
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)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65590197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档