在rails中Alter ignore table的等价物是什么

时间:2015-01-09 12:14:46

标签: mysql ruby-on-rails ruby-on-rails-3

我有一个为habtm关系创建的连接表。之前我已经为该表创建了一个索引,但后来我想将唯一的true属性添加到索引中,我为此编写了一个新的迁移,它应该删除旧索引并创建新索引。但问题是我的数据库已经包含了一些重复的值,在mysql中我们有办法使用 alter ignore table。为:

ALTER IGNORE TABLE pst_nw ADD UNIQUE INDEX (add1, add2, add3, add4);

它在铁轨中的等价物是什么。我们如何通过迁移指定忽略标志?

2 个答案:

答案 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功能。

将功能分成两部分可能是一个好主意:

  1. 删除重复数据
  2. 添加唯一索引
  3. 第一个任务可以通过运行ALTER IGNORE TABLE .. ADD UNIQUE INDEX..步骤,然后执行DROP INDEX步骤作为脚本的一部分(rake任务/单独脚本/直接在mysql中运行查询等)来完成。将只需要运行一次。

    第二个是简单的add_index迁移。