mysql - 当我尝试在 Rails 项目中创建唯一索引时出现空迁移

标签 mysql ruby-on-rails migration constraints unique

我正在使用 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 guidemigrations 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 的其他一些规则。例如。如果 userusers 表的 FK,则将其放在前面将涵盖在 WHERE 中使用 user 的查询、ORDERGROUP BY 等(例如 SELECT ... FROM user_objects WHERE user_id = ...),无需单独的索引。但更重要的因素是cardinality ,这基本上是“user_objects 中的 dayobjectuser 中的每一个有多独特?”把最独特的放在第一位。

关于mysql - 当我尝试在 Rails 项目中创建唯一索引时出现空迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35166570/

相关文章:

php - 我从PHP应用程序中收到以下警告,我想知道如何修复它: [duplicate]

php - 另一个表格提交问题

ruby-on-rails - 将 "rails runner"用于 cron 作业是非常占用 CPU 的 - 替代方案?

python - Django 迁移 : Not reflecting changes | creates only id

MySQL 到 SQL Server 迁移

wordpress - 将 Wordpress.com 托管博客转换为 BlogEngine.NET

mysql - 在 Doctrine 中运行更新查询时出错

php - Mysql 连接除了 SELECT * INTO OUTFILE 语句外都有效

ruby-on-rails - 如何在 Rails 中执行 Controller / Action ?

css - 将谷歌字体添加到 Rails 应用程序