Rails3迁Rails6后用Upsert all遇"No unique index found for id"问题
Rails 3迁Rails 6后用upsert_all报错"No unique index found for id"的问题解析
- 问题现象:从Rails 3迁移到Rails 6后,调用
upsert_all时报错No unique index found for id,按常规认知主键id应该自带唯一性,却出现了这个问题。 - 版本关联原因:确实和版本迁移有关。Rails 3时代,数据库主键id的唯一性由数据库层面的主键约束保证,但Rails并没有要求必须显式创建对应的唯一索引;而Rails 6的
upsert_all方法对唯一索引的校验逻辑更严格——它需要依赖显式的唯一索引来定位要更新的记录,哪怕数据库主键本身有唯一性约束,没有显式创建唯一索引就会触发该错误。 - 解决办法:给id字段添加显式的唯一索引,迁移代码如下:
def change add_index :order_lists, :id, unique: true, algorithm: :concurrently end
注:使用algorithm: :concurrently参数可以避免添加索引时锁表,适合生产环境执行。
内容的提问来源于stack exchange,提问作者Dhivya
相关产品推荐
相关产品推荐

