3
1

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.

(解決方法)Mysql2::Error: Table 'users' already exists

Last updated at Posted at 2020-12-14

発生したエラー

devise導入の流れの中で、マイグレーションファイルを修正し、いざrails db:migrateを実行すると、下記のエラーが発生。

Mysql2::Error: Specified key was too long; max key length is 767 bytes

調べたところ、database.yml の、 encoding: utf8mb4を encoding: utf8へ修正する必要がある。
(utf8mb4だと、1文字あたり4bytes使い、文字数制限をoverしてしまうそうだ)

そのため、encoding: utf8へ修正し、再度rails db:migrateを実行すると、タイトルのエラー(下記)が発生。
Mysql2::Error: Table 'users' already exists

調べた内容と仮説

エラーを和訳すると、usersテーブルが既に存在するということ。
今回、rails db:migrateを実行しようとした結果、表示されたエラーであるため、恐らくすでにmigrateされている
(=ststusがupの状態)ということのはず。

つまり、rollbackし、usersテーブルを一度削除し、再度作成すれば解決する、という仮説が建てられる。

仮説に基づいた実行結果

rails db:rollback
rails d devise user
rails g devise user
マイグレーションファイルを修正
rails db:migrate

→再度タイトルのエラー(Mysql2::Error: Table 'users' already exists)

意味がわからない。。

結論

結果として、rails db:resetで解決されました。
この理由としては、schema.rbの存在でした。

このファイルは、migrateファイルの生成順序などを管理しています。
そして、このファイルをリセットしなければ、例えテーブルを削除したところで、upの状態になっているそうです。
なので、一度テーブルを削除しても、エラーが維持されるようであれば、resetを頭に入れるべき。

注意点としては、別のテーブルもリセットされてしまうこと。慎重にならなければならない。

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?