Debug My Life.

いろいろデバッグをがんばるブログ。

laravelのmigrationで外部キー参照制約を一時無効化してchangeする方法

ちょっとしたTips。

外部キー参照制約を持つカラムを変更したいと思って、migrationファイルでchange処理を書いて実行すると、外部キー参照制約のエラーですとなった。

SQLSTATE[HY000]: General error: 1832 Cannot change column 'customer_scale_id': used in a foreign key constraint 'trn_reservations_customer_scale_id_foreign'

そういうときは、その変更対象のテーブルの外部キー参照制約を一時的に無効化して定義を変更すればよい。具体的には以下。

public function up()
{
    //外部キー制約を一旦無効化
    Schema::disableForeignKeyConstraints();

    Schema::table('trn_reservations', function (Blueprint $table) {
        $table->string('inquiry', 2000)->nullable()->after('customer_scale_id');

        //null不許可へ
        $table->unsignedSmallInteger('theme_id')->nullable(false)->change();
        $table->string('organizer_company', 255)->nullable(false)->change();
        $table->unsignedSmallInteger('customer_scale_id')->nullable(false)->change();
    });

    //外部キー制約を有効化
    Schema::enableForeignKeyConstraints();
}

down処理時も同様に無効化して、戻す処理、有効化の順で記述してやる。一時的に無効化しているだけなので、migration実行後は外部キー参照制約は残ったままとなる。

データベース:マイグレーション 5.5 Laravel

ちなみにnot null制約への変更の nullable(false)->change(); はlaravel 5.5以上からできるようになったらしい。便利になった。

qiita.com