如何通过迁移向已存在的索引添加"唯一"约束

iro*_*and 53 postgresql ruby-on-rails

如何unique: true在Rails数据库中为已存在的索引添加约束?

我试图迁移

  def change
    add_index :editabilities, [:user_id, :list_id], unique: true
  end
Run Code Online (Sandbox Code Playgroud)

但是迁移失败并出现这样的错误.

表'editabilities'上的索引名称'index_editabilities_on_user_id_and_list_id'已存在

我正在使用rails4和postgresql.

Bal*_*ick 90

删除旧索引并使用新约束再次添加它:

def change
  remove_index :editabilities, [:user_id, :list_id]
  add_index :editabilities, [:user_id, :list_id], unique: true
end
Run Code Online (Sandbox Code Playgroud)

  • `schema.rb`在Rails 4.2.0上为我更新了.可能是一个现在已经解决的错误?或者它可能依赖于数据库; 我正在使用Postgres. (2认同)
  • 如果您具有阻止删除索引的外键约束,则此方法不起作用。在这种情况下,您可以删除外键,然后删除索引,然后再次添加新索引。ruby ... remove_foreign_key:editabilities,列::user_id remove_index:editabilities,:user_id add_index:editabilities,:user_id,unique:true end```如果您依赖生产数据库中的索引,则可能需要添加首先使用不同的名称创建一个新的修改索引,因此您有两个索引。然后,您可以删除旧索引,然后重命名新索引。 (2认同)