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

Rails迁移添加索引unique属性被忽略 PostgreSQL无唯一约束

问题排查及解决方法

排查步骤

  • 确认迁移匹配目标环境
    先运行命令校验迁移状态:
    rails db:migrate:status
    确认AddUniqIndexToCompanyList迁移的状态为up,同时确认当前运行的Rails环境和你查看的PostgreSQL数据库是同一个,避免出现跑了测试环境迁移、却查开发库的低级错误。
  • 校验表内是否存在重复值
    即使迁移提示无报错,如果代码中有异常捕获逻辑也可能吞掉PostgreSQL的创建失败提示,先执行SQL查询是否有重复的company_id:
    SELECT company_id, COUNT(*) FROM company_lists GROUP BY company_id HAVING COUNT(*) > 1;
    
    如果有返回结果,先清理重复数据后再重新执行迁移。
  • 正确校验索引属性
    不要通过图形化工具的预览判断索引属性,执行PostgreSQL原生查询确认:
    SELECT indexname, indisunique 
    FROM pg_indexes 
    JOIN pg_class ON pg_indexes.indexname = pg_class.relname 
    WHERE tablename = 'company_lists';
    
    查看index_company_lists_on_company_id对应的indisunique值是否为t。
  • 排查后续迁移是否覆盖配置
    按时间顺序梳理所有和company_lists表相关的迁移,确认没有在该唯一索引迁移之后的其他迁移,再次删除重建该索引为非唯一属性。

优化建议

如果你的迁移经常用到原生SQL语句,建议将schema格式改为SQL格式,避免schema.rb同步出现偏差,修改config/application.rb配置:

config.active_record.schema_format = :sql

后续会生成structure.sql替代schema.rb,能更精准的同步数据库结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:27:00