当我尝试在我的 rails 项目中创建唯一索引时进行空迁移

Getting empty migration when II try and create a unique index in my rails project

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

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” 时显然什么也没有发生。我在尝试跨多个列创建唯一索引时做错了什么,在命令行上执行此操作的正确方法是什么?

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

来自 mysql 命令行提示符:

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

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

rails generate migration add_username_to_user_objects username:string:uniq

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

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

建议:唯一索引中的字段顺序会影响性能和一些其他有关 SQL 的规则。例如。如果 userusers table 的外键,将其放在首位将涵盖您在 WHEREORDERGROUP BY 等(例如 SELECT ... FROM user_objects WHERE user_id = ...)而不需要单独的索引。但更重要的因素是cardinality,基本上就是"How unique is each of day, object, userin user_objects?"把最独特的放在第一位