Laravelのマイグレーション実行時、以下のようなエラーが発生したときの対処。
$ php artisan migrate
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
...
マイグレーションの実行順に注意
外部キーの参照先テーブルがまだ作られていない場合エラーになってしまう。
マイグレーションの実行順は基本的にファイルの日付順になっている(例: __2014_10_12_000000___create_users_table )ようなので、基本的にはファイルを作成する際、参照先のテーブルに対応するファイルから順に作成すれば問題ない。(ファイル名を変更することでも対応はできるようだが、実践的にはあまり好ましい方法ではないはず。)
また、同じような理由でシーディングを実行する際も、参照する先のレコードが存在しなければエラーになるようなので注意。
ここが間違っていないことを確認してなお同様のエラーが発生するため、色々調べたところ、次の部分を直すことで解決した。
型が一致しているかに注意
参照先と参照元の型が一致していないとエラーになる様子。ここが間違ってた。
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
...
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()
に修正することで正常に動作した。
Schema::create('posts', function (Blueprint $table) {
...
$table->unsignedBigInteger('user_id');
...
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
...