Quantcast
Channel: laravel5.8タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 87

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

$
0
0

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テーブルの主キーはbigIncrement()を使用しているが、対応する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');
            ...

Viewing all articles
Browse latest Browse all 87

Trending Articles