【问题标题】:What is the equivalent of Alter ignore table in rails什么相当于rails中的Alter ignore table
【发布时间】:2015-01-09 12:14:46
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我的方法是使用execute 运行原始的ALTER IGNORE 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
    

    【讨论】:

    • alter ignore 已从 mysql 5.7 中删除
    【解决方案2】:

    我认为 rails 中没有与 ALTER IGNORE TABLE 功能等效的直接单行代码。

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

    1. 删除重复数据
    2. 添加唯一索引

    第一个任务可以通过运行ALTER IGNORE TABLE .. ADD UNIQUE INDEX.. 步骤来完成,然后运行DROP INDEX 步骤作为脚本的一部分(rake 任务/单独的脚本/直接在 mysql 中运行查询等),这需要只运行一次。

    第二个是简单的add_index 迁移。

    【讨论】:

    • 是的,这也是我做过的,使用 Alter ignore table.. add unique index.. from the database,并在迁移中使用 ruby​​ 代码来完成任务,但这不是我认为正确的方法是,因为我认为与 db 相关的所有工作都应该只通过我们的 ruby​​ 代码来完成。这种方式对我来说实际上感觉将 ruby​​ 代码与 db 的集成分开。
    • 您仍然可以运行 Alter ignore table.. add unique index.. drop index 步骤作为我上面提到的 ruby​​ 脚本/rake 任务的一部分。但是,它不应该是迁移的一部分,因为这不应该是可逆的。即,您不希望通过回滚迁移回到具有重复行的状态。
    • 好的,我明白了。您是在谈论通过 rake 任务运行原始 sql 查询,否则,您能帮我语法吗?
    • 对,我的意思是在 rake 任务中运行原始 sql 查询。 Rails 中没有对应的语法。
    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2012-03-09
    • 2017-12-24
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多