概要
- マイグレーションを行ったところ、実行順でテーブル作成ができず解決に時間がかかってしまった
事象概要
$ php artisan migrate
Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
INFO Running migrations.
2024_04_17_135308_XXX_XXX_XXX ............................................................. 622ms FAIL
Illuminate\Database\QueryException
SQLSTATE[HY000]: General error: 1824 Failed to open the referenced table 'ZZZ' (Connection: mysql, SQL: alter table `YYY` add constraint `YYY_XXX_ZZ_foreign` foreign key (`XXX_ZZ`) references `ZZZ` (`hoge`))
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:829
825▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
826▕ );
827▕ }
828▕
➜ 829▕ throw new QueryException(
830▕ $this->getName(), $query, $this->prepareBindings($bindings), $e
831▕ );
832▕ }
833▕ }
+9 vendor frames
10 database/migrations/2024_04_17_135308_XXX_XXX_XXX.php:11
Illuminate\Support\Facades\Facade::__callStatic("create")
+24 vendor frames
35 artisan:35
Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
このような形で、エラーが発生していた
解決法
簡単にエラーの内容をまとめると、外部キー制約
によりあるはずのテーブルが存在しないために発生している
そのため、生成順を気を付ける必要がある
参考サイト
参考サイトにもあるように、生成順をいじるにはマイグレーションファイルの先頭にあるYYYY_MM_DD_hhmmssが古い順で実行されるため、実行が速くあるべきものを前に行くように調整する必要がある
php artisan migrate
本来はこれを行うことで、古い順から再実行されるはずであるが、いろいろとやりすぎたせいか自分は以前の順番で実行されてしまった。
そこで今回残したいデータはなかったこともあり、データをすべて削除して再実行するように変更した
データをすべて消す処理を事前に挟むため、やむを得ない場合を除きほかの手段を利用することを推奨します。
また、もし本番環境で実行する場合は必ずバックアップを取るようにしましょう。
本当にすべてのテーブルを削除するので注意です
php artisan migrate:fresh
これをすると、テーブルが初期化されるためすでにテーブルがある等のエラーがなく、単に順番による依存関係のみを考えればよくなります。
が、、最終手段なので本番環境を触っている人は注意してください
まとめ
外部制約に苦しめられたが、必ず必要な部分であるため開発段階で調整できてよかった
しかし、今後開発が進む中で運用中のシステムを変える場合は、また違ったアプローチで常に気を使う必要があり、大変に難しい問題であるとも感じた。