如何更改表上定义的索引?

时间:2012-06-04 06:42:08

标签: ruby ruby-on-rails-3 indexing

我的索引定义为

add_index :users, :email, :unique => true

有没有办法改变这个索引来删除UNIQUE约束,比如'change_index'? 或者它是删除索引并在没有UNIQUE约束的情况下再次添加索引的唯一方法吗?

3 个答案:

答案 0 :(得分:2)

不同的索引类型通常在您使用的数据库中以非常不同的方式实现。主索引与任何二级索引非常不同。并且唯一索引通常与搜索索引不同,以方便其主要用例:快速确定列中是否已存在值,而不是允许有效搜索。

因此,(取决于您的DBMS)您无法更改现有索引。在任何情况下,你最安全的赌注是放弃索引并创建一个新索引。这可以在实时操作期间完成。无需关闭数据库和rails应用程序。

答案 1 :(得分:2)

迁移中没有“change_index”,因此您可以这样做:

remove_index :users, :email

add_index :users, :email, :unique => false

答案 2 :(得分:0)

这应该分两步完成 - 首先在一个迁移文件中创建所需的索引,然后将现有的索引放在另一个迁移文件中。

第一档:

class AddNewIndex < ActiveRecord::Migration
  disable_ddl_transaction!

  def change
    add_index(
      :users,
      :email,
      unique: false,
      name: "index_non_unique_emails_on_users",
      algorithm: :concurrently
    )
  end
end

第二档:

class DropOldListCIndexFromPushLogs < ActiveRecord::Migration
  def change
    remove_index(
      :users,
      name: <existing unique index name> # have a look in db/schema.rb
    ) if index_exists?(:users, name: "index_non_unique_emails_on_users")
  end
end

如果您不熟悉安全迁移,请查看Zero Downtime Migrations' readme