#エラーに陥った経緯
下記のマイグレーションファイルでスペルミスをしてしまい、悪いことにreferenceの部分でミスをしたのでめんどくさいことになりました(涙)。
add_column :posts, :lunch_text, :text
add_column :posts, :lunch_image, :text
add_column :posts, :lunch_address, :string
add_column :posts, :lunch_link, :string
add_reference :posts, :place, foreign_key: true
add_reference :posts, :sub_place, foreign_key: true
#最後の行でsubplaceと入力すべきところをsub_placeとして、指定するテーブル名のスペルをまちがえてしまう。
スペルを間違えたのでrails db:rollbackをし書き直し、rails db:migrateを行ったところエラーに陥る。
#エラー内容
rails db:migrateした際に下記のエラーが出る
Mysql2::Error: Duplicate column name 'lunch_text': ALTER TABLE `posts` ADD `lunch_text` text
postsテーブルにlunch_textというカラムが重複していると言われているのですが
rails db:statusで確認すると当該ファイルはdownになっている。
ここで、マイグレーションファイルがdownになっているのにDBに当該マイグレーションファイルが反映されているという矛盾した状態になってしまいました。
#SQLを使用し解決
矛盾した状態を解決するためSQLで直接重複しているとされているカラムを削除しました。
その際下記のコマンドでカラムを削除します
ALTER TABLE posts DROP COLUMN lunch_text, DROP COLUMN lunch_image , DROP COLUMN lunch_address, DROP COLUMN lunch_link;
外部キー削除も同じように
ALTER TABLE posts DROP COLUMN place_id, DROP COLUMN sub_place_id;
とすると
ERROR 1553 (HY000): Cannot drop index 'index_posts_on_place_id': needed in a foreign key constraint
というエラーが出ます。
これは外部キー制約がかかっているのでindexが削除できないといっています。
よって外部キー制約を先に削除してあげなければいけません。
外部キー制約名を下記のコマンドで確認します。
SHOW CREATE TABLE テーブル名;
CONSTRAINTの右側にあるのが外部キー制約名です。
この外部キー制約名を使い外部キー制約を削除してから、外部キーカラムを削除するとうまくいきます。
#rails db:migrateのエラー解決
SQLで重複しているカラムを削除し、マイグレーションファイルと実際のDBの矛盾がなくなったので
rails db:migrateがエラーをはかず実行されます。