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実行後は外部キー参照制約は残ったままとなる。
ちなみにnot null制約への変更の nullable(false)->change(); はlaravel 5.5以上からできるようになったらしい。便利になった。