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

PostgreSQL创建唯一索引报错:无重复记录却提示ID重复

解决TypeORM迁移添加唯一约束时PostgreSQL 23505重复键错误

问题根源分析

错误提示明确指向daily_stats表的morning_sequence_log_id字段存在重复值5d482f31-4763-442a-8a00-f449d3302ac8,和completed_activity_sequences表的id是否重复无关——你查错表了。PostgreSQL的唯一约束是针对当前要加约束的表(也就是daily_stats)里的字段值,不是关联表的主键。

分步解决方案

1. 定位daily_stats中的重复记录

执行以下SQL查询,找出所有morning_sequence_log_id重复的行:

SELECT morning_sequence_log_id, COUNT(*) AS count
FROM daily_stats
GROUP BY morning_sequence_log_id
HAVING COUNT(*) > 1;

你应该能在结果里看到报错的那个UUID,以及它对应的重复行数。

2. 清理重复数据

根据业务逻辑选择处理方式:

  • 删除多余行:如果某些重复记录是无效数据,直接删除(执行前先备份或预览):
    DELETE FROM daily_stats
    WHERE id IN (
      SELECT id
      FROM (
        SELECT id,
               ROW_NUMBER() OVER (PARTITION BY morning_sequence_log_id ORDER BY id) AS rn
        FROM daily_stats
      ) t
      WHERE rn > 1
    );
    
  • 更新字段值:如果重复记录需要保留,将其中部分行的morning_sequence_log_id改为其他有效值(比如关联到正确的completed_activity_sequences记录),或者业务允许的话设为NULL(PostgreSQL中多个NULL不会触发唯一约束冲突)。

3. 重新执行迁移

清理完重复数据后,再次运行TypeORM迁移命令,应该就能成功添加唯一约束了。

4. 预防后续问题

  • 检查迁移脚本:确保添加唯一约束前,没有批量插入会导致重复的逻辑;如果该字段允许NULL,在迁移里明确设置nullable: true。
  • 同步环境数据:确认staging环境的daily_stats表中该字段没有重复值,避免未来部署到staging时出现同样问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:45:00