blueberrycakeのブログ

railsとwebサービスについて書いています

rake db:rollbackでadd_indexするときは注意

migrationでunique制約の付いたindexを削除するために以下のmigrationファイルを作成します。

def up

  remove_index :tables, :column

end

 

def down

  add_index :tables, :column, :unique => true

end

これをmigrateしてもこの時点では問題ありません。

但し、columnの内容が重複するレコードが存在した状態で、元に戻すと以下のエラーになります。

rake db:rollback

Mysql2::Error:   Duplicate entry   ''   for   key   'index_tables_on_column': CREATE   UNIQUE   INDEX   `index_tables_on_column`   ON   `tables` &nbsp (`column`)

unique制約のindexが作成されると、既存のレコードに制約チェックが掛かるのでエラーとなりますね。

これを回避するには、以下の方法が考えられます。

  • テーブルを空にしておく
  • 制約チェックに引っかからないように、データの内容をセットしておく