【问题标题】:Getting empty migration when II try and create a unique index in my rails project当我尝试在我的 Rails 项目中创建唯一索引时获得空迁移
【发布时间】:2016-02-03 00:46:59
【问题描述】:

我正在使用 Rails 4.2.3 和 MySQL 5.5.37。我想在我的表上创建一个唯一约束,涉及多个列,所以我跑了……

rails generate migration add_index :user_objects, [:day, :object, :user], :unique => true

但是,这会生成一个文件 db/migrate/20160203003708_add_index.rb,其中没有任何内容……

class AddIndex < ActiveRecord::Migration
  def change
  end
end

所以当我运行“rake db:migrate”时显然没有任何反应。我在尝试跨多个列创建唯一索引时做错了什么,在命令行上做这件事的正确方法是什么?

【问题讨论】:

    标签: mysql ruby-on-rails migration constraints unique


    【解决方案1】:

    根据migrations guidemigrations API docs 从命令行生成迁移只支持创建新表和添加新列。需要创建的表或添加的列由使用_to_ 之后的部分的迁移名称确定。例如。运行如下命令:

    rails generate migration add_username_to_user_objects username:string:uniq
    

    会生成一个迁移,它将一个唯一的usernamecolumn(即使它已经存在)添加到user_objects 表中。现在,即使命令支持添加索引等,语法也可能很难记住并且很脆弱(因为 Bash 等),以至于许多人宁愿只是将代码写入文件:) :

    # db/migrate/20160203003708_add_index.rb
    def change
        add_index :user_objects, [:day, :object, :user], unique: true
    end
    

    一个建议:唯一索引中的字段顺序会影响性能和一些其他关于 SQL 的规则。例如。如果userusers 表的FK,则将其放在首位将涵盖在WHEREORDERGROUP BY 等(例如SELECT ... FROM user_objects WHERE user_id = ...)中使用user 的查询,而无需单独的索引为了它。但更重要的因素是cardinality,它基本上是“dayobjectuserin user_objects 中的每一个有多独特?”把最独特的放在第一位。

    【讨论】:

      【解决方案2】:

      (我无法回答问题的 Rails 部分。)

      从 mysql 命令行提示符:

      USE databasename;
      ALTER TABLE user_objects ADD UNIQUE d_o_u (day, object, user);
      quit
      

      【讨论】:

        猜你喜欢
        • 2018-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 2018-06-15
        • 2020-11-15
        • 1970-01-01
        相关资源
        最近更新 更多