laravelでforeign_key追加でmigrationエラーになる場合の対処法。

更新日:

laravelですでに作成済みのテーブルに対して、マイグレーションファイルを使って、foreign_key(外部キー)を追加しようと試みた際、以下のようなエラーが出てハマってませんか?

 

Migrating: 2020_11_20_110730_add_foreign_to_forms_table

Illuminate\Database\QueryException : SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`newsite`.`#sql-594_584`, CONSTRAINT `forms_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)) (SQL: alter table `forms` add constraint `forms_user_id_foreign` foreign key (`user_id`) references `users` (`id`))

子の行は挿入、更新はできない。外部キー作成に失敗。

なんのこっちゃという感じでハマってしまいますが、実はすごく単純な事でエラーは消えます。

 

laravelでforeign_key追加でmigrationエラーになる場合の対処法。

まず、仮に下図のように、既存のテーブルに、user_idカラムとforeign_keyを作成して、マイグレーションしたとします。

LaravelのMigrationでカラムを追加、編集、削除のやり方。初心者でもよく分かるように解説!

 

で、これだとエラーが出るわけですが、

上のエラーが出た場合、カラム自体はエラーが出ても作成されてしまってます。

 

なので、phpMyAdminにログインし、作られてしまったuser_idカラムを手動で削除しましょう。

 

削除しないと、もう一度マイグレーションした時に、今度は、

Illuminate\Database\QueryException : SQLSTATE[42S21]: Column already exists: 1060 Duplicate column name 'user_id' (SQL: alter table `forms` add `user_id` bigint unsigned not null)

すでにuser_idカラムは存在するから、追加できないよ!と怒られます。(いや、お前がエラーと言いつつ勝手に作ったんだろ!って感じですが)

 

というわけで、カラム削除をしたら、失敗したマイグレーションファイルをテキストエディタで開きます。

先程のカラム追加用のコードに、->nullable()を追記して、上書き保存してください。

結局、nullableじゃないから、追記できないというエラーが出るんです。

 

これで再度、php artisan migrate してみてください。これでうまく行くはずです。

 

それでもエラーが出る場合は?

よくあるのは、元のテーブルがbigIntegerなのに、bigIntegerを使わないで、integerを使ってるパターンです。

例えば、usersテーブルを作成したマイグレーションファイルを開いてみると、
bigIncrementsが指定されています。

 

phpMyAdminから見ると、bigintとなってますね。

 

つまり、foreign_keyを作る時も、integerではなく、bigIntegerを指定しないとエラーになります。

 

必ず、foreign_keyを作る時は、元のidが integerなのか、bigIntegerなのかをチェックして、そろえるようにする事でエラーを回避できます。

 

写真で血圧記録

  • この記事を書いた人

Neby

本を毎日多読しつつ、資産運用、プログラミング、心理学、ネットビジネススキルを猛向上中。貧富の差が広がる5年後、10年後に安心生活を送るためのお金のリテラシー、スキル、資産を一緒に作っていきましょう。

-PHP Laravel入門