LoginSignup
6
0

More than 3 years have passed since last update.

[Rails]エラーStandardError: An error has occurred, all later migrations canceled: Column `外部キー名` on table `テーブル名` does not match column `id` on `テーブル名`の対処方法

Posted at

エラー内容

$ rails db:migrate

上記コマンドを実行すると発生するエラー。ターミナルでのエラー表記は以下の通り。
image.png

エラー文一部抜粋.
Column `user_id` on table `items` does not match column `id` on `users`, which has type `bigint(20)`. To resolve this issue, change the type of the `user_id` column on `items` to be :bigint. (For example `t.bigint :user_id`).

エラー文の一部を翻訳してみると...。

エラー文翻訳.
テーブル `items` のカラム `user_id` が `users` のカラム `id` と一致しません。この問題を解決するには、`items` の `user_id` カラムの型を :bigint に変更します。(例えば `t.bigint :user_id`)。

今回はitemsテーブルが外部キーとして指定しているカラムが参照元と一致しませんよ!というエラーですね。

対処法(仮説)

結論、Railsでは外部キーを使用する際はreferences型を推奨しているので、bigint型を使用する必要はありません。

このエラーのポイントは参照できませんということなので、マイグレーションファイルの作成順に問題があると仮説できます。

マイグレーションファイルの作成順とは?

外部キーを使用するテーブル(references型を記述するテーブル)と参照されるテーブルには作成順によって参照できなくなる場合があり、今回のエラーは作成順序の誤りで発生しました。

作成順は、①参照される側のテーブル→②外部キーを使用するテーブル(references型を記述するテーブル)です。
対処法はマイグレーションファイルの作成日時を修正してあげれば解決できます。

対処法(仮設検証)

image.png
添付画像の数字部分を、参照される側のテーブルよりも外部キーを使用するテーブルの数字を大きくすれば解決します。

エラー分からは少し推測しづらいエラーですね。

今回の場合だと、create_items20200909000000なら20200909100000でいいです。
ちなみに、最初の4桁は西暦、次の4桁は月日です

最後に

今回のエラーはテーブル数が増えると発生しやすいエラーなのかなと思います。
ただ、対象法を知っていれば問題なく解決できると思いますので、参考にしてみてください!

6
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
6
0