You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL(Adminer)为已有表添加起始值1000001的自增字段

PostgreSQL给foo表新增指定起始值自增字段(Adminer操作方案)

针对30万存量数据的UUID主键表,直接通过可视化界面加自增字段会默认从1开始计数,不符合起始值1000001的要求,全程通过Adminer的SQL命令窗口执行以下操作即可,不需要修改服务配置或借助额外工具。


操作步骤
    1. 登录Adminer进入对应业务库,点击顶部导航栏的「SQL命令」入口,进入SQL执行界面。
    1. 先新增普通整数字段,暂不绑定自增属性,避免系统自动生成从1开始的默认序列:
-- 推荐用BIGINT,避免后续序号超过INT上限,数据量确定可控也可替换为INTEGER
ALTER TABLE foo ADD COLUMN auto_id BIGINT;
    1. 为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万数据按主键关联回填,正常执行耗时在数秒级别,不会长时间锁表。

    1. 给字段加非空约束,符合自增字段的使用要求:
ALTER TABLE foo ALTER COLUMN auto_id SET NOT NULL;
    1. 创建专属序列,起始值设为存量数据最大序号+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');
    1. (可选)给自增字段加唯一约束,避免异常场景下出现重复序号:
ALTER TABLE foo ADD CONSTRAINT uq_foo_auto_id UNIQUE (auto_id);

结果校验

执行以下两段SQL确认配置生效:

  1. 校验存量数据序号范围:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 22:45:42