Help us understand the problem. What is going on with this article?

laravelのmigrationでハマった話 Cannot delete or update a parent row: a foreign key constraint fails

laravelでmigrationを実行するため、
php artisan migrate:refresh を叩いたところ、以下のエラーが出た。

Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table if exists `comments`)
laravel__migration-error.png

親子関係のアソシエーションを組んでいる場合、
migrationファイルのdownメソッドで、
親子関係の親に当たるテーブルも削除しないと、このエラーが出るらしい。

なのでこうした。

yyyy_mm_dd_152937_create_comments_table.php
// 省略
    public function down()
    {
        Schema::dropIfExists('posts'); //付け足した
        Schema::dropIfExists('comments');
    }

でもまだ同じようなエラーが出た。
(エラー文のテーブル名がposts に変わっただけの同じエラー。)

解決した方法

調べたところ、テーブルのdropの順番が大事らしい。
子テーブルであるcommentsから先にdropするよう順番書き換えた。

今回は、postsテーブルが親、commentsテーブルが子。
なので以下のように記述順番を入れ替えた。

yyyy_mm_dd_152937_create_comments_table.php
// 省略
    public function down()
    {
        Schema::dropIfExists('comments'); //子テーブルが先にdropされるよう順番を上にした
        Schema::dropIfExists('posts');
    }

これでようやく通った...!
laravel__migration-finished.png

アソシエーション組んでいる場合、
外部キーを持っている子テーブルからdropしないと、
子テーブルの外部キー制約に引っかかるらしい。

downのdropIfExistsメソッドを 子テーブル -> 親テーブル の順番で書いて、解決。

解決したと思いきや。
【続】laravelのmigrationでハマった話

MOssan-32
30代からのジョブチェンジで駆け出したばかりのWeb系エンジニア
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした