我正在使用 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”时什么也没有发生。在尝试跨多个列创建唯一索引时我做错了什么,在命令行上执行此操作的正确方法是什么?
最佳答案
根据migrations guide和 migrations API docs从命令行生成迁移仅支持创建新表和添加新列。需要创建的表或添加的列由使用 _to_
后面的部分的迁移名称确定。例如。运行如下命令:
rails generate migration add_username_to_user_objects username:string:uniq
将生成一个迁移,将唯一的username
列(即使它已经存在)添加到user_objects
表中。现在,即使该命令支持添加索引等,语法也可能很难记住且脆弱(因为 Bash 等),以至于许多人宁愿将代码写入文件中:) :
# db/migrate/20160203003708_add_index.rb
def change
add_index :user_objects, [:day, :object, :user], unique: true
end
<小时/>
建议:唯一索引中字段的顺序会影响性能以及有关 SQL 的其他一些规则。例如。如果 user
是 users
表的 FK,则将其放在前面将涵盖在 WHERE
中使用 user
的查询、ORDER
、GROUP BY
等(例如 SELECT ... FROM user_objects WHERE user_id = ...
),无需单独的索引。但更重要的因素是cardinality ,这基本上是“user_objects
中的 day
、object
、user
中的每一个有多独特?”把最独特的放在第一位。
关于mysql - 当我尝试在 Rails 项目中创建唯一索引时出现空迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35166570/