postgresql - 如何自动修复我的 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)
推荐阅读
- python - 循环问题(python):变量未正确评估
- com - 为什么我的 COM 加载项在 Outlook 桌面中丢失?
- pandas - 将每日数据转换为每月数据并在熊猫中获得几个月的最后一个值
- origen-sdk - 如何强制将所有 bin 转换为 93k multibins 的 gem 输出 93k 本机 bin?
- react-native - 在渲染视图时滚动 KeyboardAwareScrollView 以结束
- wordpress - 自定义帖子类型的单个帖子模板覆盖
- api - 管理 Gcal 响应 + 快递和标头问题
- php - Stripe Checkout PHP 导致神秘的 404 错误 OnLoad
- .net-core - 如何使用 MqttNET 在 azure 函数中使用 PEM 文件
- amazon-web-services - ElasticBeanstalk:无法在 GUI 中将环境类型更改为负载平衡?