Laravelのマイグレーションが外部キー制約で引っかかる場合があります。こういったときのチェックポイントをまとめておきます。マイグレーションの順番は意外な盲点なので、忘れずにチェックしておきましょう!
カラム名はあってる?
最初にマイグレーションのカラム名をチェックです。
// 外部参照するテーブル
Schema::create('items', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('master_id')->comment("マスターのID")->nullable();
$table->foreign('master_id')->references('id')->on('masters');
});
// 外部参照先(参照を受けるほうの)テーブルのスキーマ
Schema::create('masters', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name')->comment("名前")->nullable();
});
テーブル名、カラム名が正しいか確認してください。
型はunsignedBigIntegerにする
IDを外部参照するときは、データ型をunsignedBigIntegerにします。
$table->bigIncrements('id');
//を参照するなら、
$table->unsignedBigInteger('master_id')
//とする
通常、テーブルのIDカラムはbigIncrementsで自動採番としますが、bigIncrementsを参照したい場合は、unsignedBigIntegerで参照する必要があります。
マイグレーションの順番に注意!
盲点です。マイグレーションの順番に注意です。
マイグレーションはファイル名昇順で実行されるので、参照を受けるテーブルを先に作って置く必要があります。
たとえば、以下のようなマイグレーションファイルがあったとします。
この場合、question_setsテーブルからquestion_listsテーブルに参照が向けられていると、マイグレーションはうまくいきません。
create_question_sets_tableが実行される時点では、question_listsテーブルは存在しないためです。必ず参照先のテーブルから作成されるように、マイグレーションファイルの名前を変更しておく必要があります。
また、1つのマイグレーションファイルで複数テーブルを作成する場合も要注意です。
// 外部参照するテーブルをつくる
Schema::create('items', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('master_id')->comment("マスターのID")->nullable();
$table->foreign('master_id')->references('id')->on('masters');
});
// →mastersテーブルがまだつくられていないので、失敗する
Schema::create('masters', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name')->comment("名前")->nullable();
});
テーブルAからテーブルBを参照するなら、テーブルBのマイグレーションが先に実行されるようにします。
// 外部参照先(参照を受けるほうの)テーブル
Schema::create('masters', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name')->comment("名前")->nullable();
});
// 外部参照するテーブル
Schema::create('items', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('master_id')->comment("マスターのID")->nullable();
$table->foreign('master_id')->references('id')->on('masters');
});
// →mastersテーブルがつくられているので、成功する
まとめ
個人的によくひっかかると思われるポイントは以上の3点です。
とくにマイグレーションの順番は忘れがちなポイントですので、外部キー制約でエラーとなった場合は、確認してみることをおすすめします。
コメント