質問: **users テーブル** **lectures テーブル** 上記2つのテーブルがあり、 lecturesの「user_id」カラムと users の「id」カラムとを紐付けたいので、 このようにしました。 **add_foreign_to_lectures_table.php** ``` foreign('user_id')->references('id')->on('users'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('lectures', function (Blueprint $table) { $table->dropForeign('lectures_user_id_foreign'); }); } } ``` しかし、このようなエラーが返ってきてしまいました。 > > > ``` > SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`bbl`.`#sql-51e8_25`, CONSTRAINT `lectures_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)) (SQL: alter table `lectures` add constraint `lectures_user_id_foreign` foreign key (`user_id`) > references `users` (`id`)) > > ``` > > これについて、解決策を教えていただければ幸いですm(_ _)m
回答: 今回の原因は 「users.idに存在しないデータがlectures.user_idに存在している」からです。 対処法としては 「lectures.user_idに存在しているusers.idに存在しないデータ」を削除するか置き換えないといけません。 外部キー制約は 「参照元フィールドに存在するデータのみ参照先フィールドのデータに存在できる」 という仕様です。 今回の場合は 「users.idに存在するデータのみlectures.user_idに存在できる」 という形になります。 ただしそもそも 「users.idに存在しないデータがlectures.user_idに存在している」 場合その外部キーを設定することすらできません。 今回のエラーもそのようなメッセージです。 じゃあどのようなデータが存在しているかは実際データをみて調査してみてください。 またどのような対応を取るかもシステムの仕様に依存するので対処の方法も変わります。 * 整合性が取れないデータをdeleteするか * usersにデータを追加する * lectures.user_idにnullを代入する のいずれかになると思います ちなみに コメントのデータの中身を見るとlectures.user_idに0が存在するものがありそうですね。 lectures.user_idが必須条件でない場合は0ではなくてNULLを入れるか疑似データとしてusers.idが0のデータを必要があります。