PostgreSQL(Adminer)为已有表添加起始值1000001的自增字段
PostgreSQL给foo表新增指定起始值自增字段(Adminer操作方案)
针对30万存量数据的UUID主键表,直接通过可视化界面加自增字段会默认从1开始计数,不符合起始值1000001的要求,全程通过Adminer的SQL命令窗口执行以下操作即可,不需要修改服务配置或借助额外工具。
操作步骤
- 登录Adminer进入对应业务库,点击顶部导航栏的「SQL命令」入口,进入SQL执行界面。
- 先新增普通整数字段,暂不绑定自增属性,避免系统自动生成从1开始的默认序列:
-- 推荐用BIGINT,避免后续序号超过INT上限,数据量确定可控也可替换为INTEGER ALTER TABLE foo ADD COLUMN auto_id BIGINT;
- 为30万存量数据回填连续序号,从1000001开始编号:
WITH row_rank AS ( SELECT id, -- ROW_NUMBER从1开始计数,加1000000后第一条存量数据序号即为1000001 ROW_NUMBER() OVER (ORDER BY id) + 1000000 AS fill_id FROM foo ) UPDATE foo SET auto_id = row_rank.fill_id FROM row_rank WHERE foo.id = row_rank.id;
30万数据按主键关联回填,正常执行耗时在数秒级别,不会长时间锁表。
- 给字段加非空约束,符合自增字段的使用要求:
ALTER TABLE foo ALTER COLUMN auto_id SET NOT NULL;
- 创建专属序列,起始值设为存量数据最大序号+1(30万数据回填完最大序号是1300000,所以序列从1300001开始),绑定到对应字段:
CREATE SEQUENCE foo_auto_id_seq START WITH 1300001 OWNED BY foo.auto_id;
给字段设置默认值,插入新数据时自动取序列下一个值,实现自增效果:
ALTER TABLE foo ALTER COLUMN auto_id SET DEFAULT nextval('foo_auto_id_seq');
- (可选)给自增字段加唯一约束,避免异常场景下出现重复序号:
ALTER TABLE foo ADD CONSTRAINT uq_foo_auto_id UNIQUE (auto_id);
结果校验
执行以下两段SQL确认配置生效:
- 校验存量数据序号范围:
SELECT MIN(auto_id) AS min_num, MAX(auto_id) AS max_num FROM foo;
正常返回结果min_num为1000001,max_num为1300000即为符合预期。
2. 校验自增逻辑:
-- 插入测试数据,不指定auto_id值 INSERT INTO foo (id) VALUES (gen_random_uuid()) RETURNING auto_id;
返回的auto_id值为1300001即表示自增逻辑正常,测试完成后删除这条测试数据即可。
避坑提示
- 不要直接在Adminer的表结构可视化编辑页直接勾选「自增」新增字段,该操作默认生成从1开始的序列,存量数据会从1开始编号,完全不符合起始值要求,后续插入还容易出现序号冲突。
- 不要图省事直接把序列起始值设为1000001,否则存量回填完成后新插入数据会从1000001开始编号,和已回填的存量数据重复,触发唯一键冲突报错。
- 如果业务写入量极高,可以在执行回填操作前给表加10秒级别的写锁,避免回填过程中新插入数据导致序号断层,30万数据回填速度极快,基本不会对业务造成可感知影响。
内容的提问来源于stack exchange,提问作者Hoàng Huỳnh Nhật
相关产品推荐
相关产品推荐

