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

从RDS PostgreSQL迁移至Aurora后插入数据主键ID重复冲突问题

问题原因及解决方案

这个问题的核心是PostgreSQL序列(Sequence)的当前值没有同步到迁移后表中已存在数据的最大ID。

迁移过程中,AWS SCT和DMS通常只会同步表结构和数据,但不会自动更新自增ID对应的序列当前值。比如你的global_options表已经有ID为3的记录,但对应的序列global_options_id_seq的当前值还是2,当Rails尝试用序列生成下一个ID(3)时,就会触发主键重复的报错。

解决步骤:

  1. 验证问题
    先查询目标表的最大ID和对应序列的当前值:

    -- 查询表中最大ID
    SELECT MAX(id) FROM global_options;
    -- 查询对应序列的当前值(序列名通常为表名+_id_seq)
    SELECT currval('global_options_id_seq');
    

    如果序列的当前值小于表中最大ID,即可确认是序列不同步导致的问题。

  2. 重置序列到正确值
    执行ALTER SEQUENCE命令,将序列的起始值设置为表中最大ID+1:

    ALTER SEQUENCE global_options_id_seq RESTART WITH (SELECT MAX(id) + 1 FROM global_options);
    
  3. 批量处理所有表(可选)
    如果多个表都存在这个问题,可以生成批量执行的SQL语句:

    SELECT 'ALTER SEQUENCE ' || quote_ident(sequence_name) || ' RESTART WITH ' || (SELECT MAX(id) + 1 FROM quote_ident(regexp_replace(sequence_name, '_id_seq$', ''))) || ';'
    FROM information_schema.sequences
    WHERE sequence_name LIKE '%_id_seq';
    

    运行这条语句会生成所有自增ID序列的重置命令,复制并执行这些命令即可批量修复。

补充说明

这属于迁移后的常规收尾操作,并非迁移操作不当,只是AWS迁移工具默认不会处理序列的当前值同步。执行序列重置后,Rails的自增ID生成就会正常从现有数据的下一个ID开始。

内容的提问来源于stack exchange,提问作者LewlSauce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:48:09