使用pgloader从MariaDB迁移至PostgreSQL后主键id插入不递增问题
问题分析与解决
你的问题核心是PostgreSQL自增主键依赖的序列(sequence)未被正确创建或初始化,导致插入时生成了已存在的ID,触发唯一约束冲突。你提到异常表没有id_seq文件,正好印证了这一点——正常表的自增主键都绑定了对应的序列,而这些表缺失了这个关键组件。
直接修复步骤
针对单个异常表(比如brand表),按以下操作处理:
查看当前表的最大ID值
先确认表中已有的最大主键值,避免序列起始值重复:SELECT MAX(id) FROM brand;创建并初始化序列
基于上面得到的最大ID+1创建序列(假设最大ID是100,就设为101):CREATE SEQUENCE brand_id_seq START WITH 101; -- 替换成实际MAX(id)+1的值关联序列到主键字段
把序列设为主键字段的默认值,这样插入时会自动调用序列生成新ID:ALTER TABLE brand ALTER COLUMN id SET DEFAULT nextval('brand_id_seq'::regclass);绑定序列与表(可选但规范)
设置序列归表所有,这样删除表时序列也会被自动清理:ALTER SEQUENCE brand_id_seq OWNED BY brand.id;
完成后再执行你的插入语句,应该就不会报错了。
排查迁移时的问题
你的pgloader命令可能在处理MySQL的AUTO_INCREMENT字段时遗漏了某些场景,建议检查:
- 确认MariaDB中这些异常表的主键是否真的标记为
AUTO_INCREMENT,如果没有,pgloader不会自动生成序列 - 检查pgloader的版本,旧版本可能对某些字段类型(比如
BIGINT AUTO_INCREMENT)的支持有问题,建议升级到最新版 - 迁移命令中可以尝试添加
cast type int auto_increment to serial这类明确的转换规则,强制pgloader为自增字段生成序列
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

