4

我有一个定义的索引

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

有什么方法可以更改此索引以删除 UNIQUE 约束,例如“change_index”?
或者它是删除索引并在没有 UNIQUE 约束的情况下再次添加它的唯一方法?

4

3 回答 3

4

迁移中没有“change_index”,因此您可以执行以下操作:

remove_index :users, :email

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

于 2012-06-04T07:45:16.360 回答
3

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

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

于 2012-06-04T06:53:27.173 回答
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

如果您不熟悉安全迁移,请查看零停机时间迁移的自述文件。

于 2017-10-05T14:45:26.147 回答