🗂️

【Laravel】PrimaryKeyを外してカラムをnullableにするマイグレーションの書き方

2022/03/22に公開

概要

PrimaryKeyに指定していたカラムがNULLを許容するためDDLを更新しようとすると以下のエラーが発生したので解決方法をまとめる

 Syntax error or access violation: 1171 All parts of a PRIMARY KEY must be NOT NULL;
ChangeProfileIdToTabletStaffMaps.php
class ChangeProfileIdToTabletStaffMaps extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tablet_staff_maps', function (Blueprint $table) {
            $table->dropPrimary('tablet_staff_maps_tablet_uuid_staff_id_profile_id_primary');
            $table->dropUnique('tablet_staff_maps_tablet_uuid_staff_id_profile_id_unique');
            $table->primary(['tablet_uuid', 'staff_id']);
            $table->unique(['tablet_uuid', 'staff_id']);
            $table->unsignedBigInteger('profile_id')->comment('プロフィールID')->nullable()->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tablet_staff_maps', function (Blueprint $table) {
            $table->dropPrimary('tablet_staff_maps_tablet_uuid_staff_id_primary');
            $table->dropUnique('tablet_staff_maps_tablet_uuid_staff_id_unique');
            $table->primary(['tablet_uuid', 'staff_id', 'profile_id']);
            $table->unique(['tablet_uuid', 'staff_id', 'profile_id']);
            $table->unsignedBigInteger('profile_id')->comment('プロフィールID')->change();
        });
    }
}

環境

  • PHP 7.4.25
  • Laravel Framework 6.20.44

解決方法

こちらの記事を参考にしました。
記事の題名通りなのですが処理を分割して記述することが必要になります

https://qiita.com/kazuhei/items/484ffe1fb8d9cbb056c1

ChangeProfileIdToTabletStaffMaps.php
class ChangeProfileIdToTabletStaffMaps extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('tablet_staff_maps', function (Blueprint $table) {
            $table->dropPrimary('tablet_staff_maps_tablet_uuid_staff_id_profile_id_primary');
        });

        Schema::table('tablet_staff_maps', function (Blueprint $table) {
            $table->dropUnique('tablet_staff_maps_tablet_uuid_staff_id_profile_id_unique');
        });

        Schema::table('tablet_staff_maps', function (Blueprint $table) {
            $table->primary(['tablet_uuid', 'staff_id']);
            $table->unique(['tablet_uuid', 'staff_id']);
            $table->unsignedBigInteger('profile_id')->comment('プロフィールID')->nullable()->change();
        });


    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('tablet_staff_maps', function (Blueprint $table) {
            $table->dropPrimary('tablet_staff_maps_tablet_uuid_staff_id_primary');
        });

        Schema::table('tablet_staff_maps', function (Blueprint $table) {
            $table->dropUnique('tablet_staff_maps_tablet_uuid_staff_id_unique');
        });

        Schema::table('tablet_staff_maps', function (Blueprint $table) {
            $table->primary(['tablet_uuid', 'staff_id', 'profile_id']);
            $table->unique(['tablet_uuid', 'staff_id', 'profile_id']);
            $table->unsignedBigInteger('profile_id')->comment('プロフィールID')->change();
        });
    }
}
GitHubで編集を提案

Discussion