1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Index name 'index_foo' on table 'bar' already existsが出たときの対処

Posted at

はじめに

railsアプリを作成中にタイトルのようなエラーにエンカウントしたので備忘録として

Index name 'index_foo' on table 'bar' already exists

同じ名前のindexがありますよというエラーです。

indexってなんぞやという人はこちらをどうぞ -> データベースにindexを張る方法

とりあえずmysqlにログインして状態を確認する
参考記事rails generate migrationしてエラーが出たときの対処法

terminal
$ mysql -u ユーザ名 -D database名 -p

-u ユーザ名指定するオプション
-D 接続先databaseを指定するオプション
-p パスワードを送信するオプション

なおデータベース名がわからなくなった場合は、config/database.ymlを確認すると書いてある


migrationがどこまで進んでいるのか確認する。railsのlogにも書いてあるが、再度確認。

mysql
mysql> select * from schema_migrations;

スクリーンショット 2020-06-13 14.00.52.png
実行されたマイグレーションファイルが出てきます。
僕の場合は20200613が実行されていなければいけないのですが出てきませんでした。


tableが作成されているのか確認

mysql
mysql> show columns from hoges; # hogeには作成したtable名を入れてください

スクリーンショット 2020-06-13 14.04.56.png
tableは存在しているようです。なければエラーを吐かれます。

次はindexが貼られているかの確認です。

mysql
mysql> show index from hoges;

スクリーンショット 2020-06-13 14.07.21.png
インデックスは貼られています。


エラー内容は、同じ名前のindexがすでに存在しますよでした。

となると、マイグレーションファイルの書きミスかなあ。
身に覚えがないが、思い当たる節として、今回はmodel作成の時にreferencesを使いました。これか!

調べてみると外部キー作成時は自動でindexを貼ってくれるみたい。2重で貼ってました…

次の図はダメな例です。
スクリーンショット 2020-06-13 14.16.15.png
直しました↓
スクリーンショット 2020-06-13 14.48.46.png

外部キーを作成する際は気をつけましょう。

参考記事

外部キーをreferences型カラムで保存する
外部キーの概要と制約を使うことのメリット・デメリット

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?