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
相关产品推荐
相关产品推荐

