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なのかをチェックして、そろえるようにする事でエラーを回避できます。