2013-12-09 27 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

相關問題