LoginSignup
12
8

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-11-09

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でハマった話

12
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
8