Help us understand the problem. What is going on with this article?

Laravelのマイグレーション時、a foreign key constraint failsになった時の対処

Laravelのマイグレーション実行時、以下のようなエラーが発生したときの対処。

$ php artisan migrate

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
...

マイグレーションの実行順に注意

外部キーの参照先テーブルがまだ作られていない場合エラーになってしまう。
マイグレーションの実行順は基本的にファイルの日付順になっている(例: 2014_10_12_000000_create_users_table )ようなので、基本的にはファイルを作成する際、参照先のテーブルに対応するファイルから順に作成すれば問題ない。(ファイル名を変更することでも対応はできるようだが、実践的にはあまり好ましい方法ではないはず。)

また、同じような理由でシーディングを実行する際も、参照する先のレコードが存在しなければエラーになるようなので注意。

ここが間違っていないことを確認してなお同様のエラーが発生するため、色々調べたところ、次の部分を直すことで解決した。

型が一致しているかに注意

参照先と参照元の型が一致していないとエラーになる様子。ここが間違ってた。

2014_10_12_000000_create_users_table.php
Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            ...
2019_10_09_074995_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
            ...
            $table->unsignedInteger('user_id');
            ...
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            ...

参照先のusersテーブルの主キーはbigIncrements()を使用しているが、対応するpostsテーブルのuser_idにはunsignedInteger()を使用しているため、BIGINTとINTEGERで型が一致せず、正常に動作しなかったらしい。

unsignedInteger()unsignedBigInteger()に修正することで正常に動作した。

2019_10_09_074995_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
            ...
            $table->unsignedBigInteger('user_id');
            ...
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            ...
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away