2013-12-09 29 views
37

如何将unique: true约束添加到Rails数据库中已存在的索引中?如何通过迁移将“唯一”约束添加到已存在的索引

我试图通过

def change 
    add_index :editabilities, [:user_id, :list_id], unique: true 
    end 

迁移,但迁移失败,出现这样的错误。

Index name 'index_editabilities_on_user_id_and_list_id' on table 'editabilities' already exists

我正在使用rails4和postgresql。

回答

58

删除旧索引并以新的约束重新添加它:

def change 
    remove_index :editabilities, [:user_id, :list_id] 
    add_index :editabilities, [:user_id, :list_id], unique: true 
end 
+0

我不得不做这两个迁移,以便'schema.rb '要更新。 – trliner

+2

'schema.rb'在Rails 4.2.0上更新得很好。可能是一个现在已经解决的错误?或者它可能与数据库有关;我正在使用Postgres。 – GMA

+0

如果您有一个外键约束阻止您删除索引,则这不起作用。在这种情况下,您可以删除外键,然后删除索引,然后再次添加新索引。 '''红宝石 ... remove_foreign_key:editabilities,列:user_id说明 remove_index:editabilities,:user_id说明 add_index:editabilities,:USER_ID,独特:真正 结束 ''' 如果你依靠您可能想要在生产数据库中使用不同的名称首先添加新的已修改索引,因此您有两个索引。然后,您可以删除旧的索引,然后重命名新的索引。 – Robert

0

比较快的方式使用add_index_options

def change 
    add_index_options :editabilities, [:user_id, :list_id], unique: true 
end 
+1

'NoMethodError:undefined method' Rails 4.1.8。看起来它存在,但我很匆忙,所以我只做两条迁移路线。 –

+3

nope,它在Rails 4.2.6中也不起作用。 '表'bar'上的索引名'foo'已经存在'。 – sunquan

相关问题