8
3

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 5 years have passed since last update.

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

Last updated at Posted at 2019-10-13

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');
            ...
8
3
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
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?