我的索引定义为
add_index :users, :email, :unique => true
有没有办法改变这个索引来删除UNIQUE约束,比如'change_index'? 或者它是删除索引并在没有UNIQUE约束的情况下再次添加索引的唯一方法吗?
答案 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。