当我尝试在我的 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 的规则。例如。如果 user
是 users
table 的外键,将其放在首位将涵盖您在 WHERE
、ORDER
、GROUP BY
等(例如 SELECT ... FROM user_objects WHERE user_id = ...
)而不需要单独的索引。但更重要的因素是cardinality,基本上就是"How unique is each of day
, object
, user
in user_objects
?"把最独特的放在第一位
我正在使用 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 的规则。例如。如果 user
是 users
table 的外键,将其放在首位将涵盖您在 WHERE
、ORDER
、GROUP BY
等(例如 SELECT ... FROM user_objects WHERE user_id = ...
)而不需要单独的索引。但更重要的因素是cardinality,基本上就是"How unique is each of day
, object
, user
in user_objects
?"把最独特的放在第一位