我有一个定义的索引
add_index :users, :email, :unique => true
有什么方法可以更改此索引以删除 UNIQUE 约束,例如“change_index”?
或者它是删除索引并在没有 UNIQUE 约束的情况下再次添加它的唯一方法?
我有一个定义的索引
add_index :users, :email, :unique => true
有什么方法可以更改此索引以删除 UNIQUE 约束,例如“change_index”?
或者它是删除索引并在没有 UNIQUE 约束的情况下再次添加它的唯一方法?
迁移中没有“change_index”,因此您可以执行以下操作:
remove_index :users, :email
add_index :users, :email, :unique => false
在您使用的数据库中,不同的索引类型通常以非常不同的方式实现。主索引与任何二级索引都非常不同。唯一索引通常与搜索索引不同,以促进它们的主要用例:快速确定列中是否已经存在值与允许有效搜索。
因此,(取决于您的 DBMS)您无法更改现有索引。在任何情况下,最安全的选择是删除索引并创建一个新索引。这可以在实时操作期间完成。无需关闭数据库和您的 rails 应用程序。
这应该分两步完成 - 首先在一个迁移文件中创建您需要的索引,然后将现有的索引删除到另一个文件中。
第一个文件:
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
如果您不熟悉安全迁移,请查看零停机时间迁移的自述文件。