2013-12-09 6 views
37

unique: trueという制約をRailsデータベースの既存のインデックスに追加するにはどうしたらいいですか?マイグレーションによって既存のインデックスに `unique`制約を追加する方法

私は

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 'ために2つの移行でこれをしなければなりませんでした'を更新する。 – trliner

+2

'schema.rb'はRails 4.2.0でうまく更新されました。現在解決されている可能性のあるバグでしょうか?あるいは、それはデータベースに依存しているかもしれません。私はPostgresを使用しています。 – GMA

+0

インデックスを削除できないような外部キー制約がある場合、これは機能しません。その場合は、 外部キーを削除してからインデックスを削除し、再度新しいインデックスを追加することができます。あなたはに依存している場合、真 エンド '' ' : ' ''ルビー ... remove_foreign_key:editabilities、列は::editabilities、:: ADD_INDEXをUSER_ID:editabilities、:user_idは、ユニークな REMOVE_INDEXをUSER_IDプロダクション・データベースでは、最初に別の名前で新しい変更済み索引を追加して、2つの索引を持たせることができます。その後、古い索引を削除してから、新しい索引の名前を変更することができます。 – Robert

0

より高速な方法add_index_optionsを使用して:

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

'NoMethodError:未定義メソッド' Rails 4.1.8。それが存在するように見えますが、私は急いでいるので、上記の2つの移行ルートを実行します。 –

+3

ではなく、Rails 4.2.6でも動作しません。 'テーブル 'bar'のインデックス名 'foo'は既に存在します。 – sunquan

関連する問題