我有一个为habtm关系创建的连接表。之前我已经为该表创建了一个索引,但后来我想将唯一的true属性添加到索引中,我为此编写了一个新的迁移,它应该删除旧索引并创建新索引。但问题是我的数据库已经包含了一些重复的值,在mysql中我们有办法使用 alter ignore table。为:
ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);
它在铁轨中的等价物是什么。我们如何通过迁移指定忽略标志?
答案 0 :(得分:2)
我的方法是使用ALTER IGNORE
运行原始execute
SQL查询,然后删除该索引并重新添加“Rails方式”以确保我的架构的一致性:
class AddUniqueIndexesToPstNw < ActiveRecord::Migration
def up
execute "ALTER IGNORE TABLE `pst_nw` ADD UNIQUE INDEX `drop_me` (add1, add2, add3, add4)"
remove_index :pst_nw, :drop_me
add_index :pst_nw, [:add1, :add2, :add3, :add4], unique: true
end
def down
remove_index :pst_nw, [:add1, :add2, :add3, :add4]
end
end
答案 1 :(得分:1)
我不认为在rails中有直接的单行等效ALTER IGNORE TABLE
功能。
将功能分成两部分可能是一个好主意:
第一个任务可以通过运行ALTER IGNORE TABLE .. ADD UNIQUE INDEX..
步骤,然后执行DROP INDEX
步骤作为脚本的一部分(rake任务/单独脚本/直接在mysql中运行查询等)来完成。将只需要运行一次。
第二个是简单的add_index
迁移。