Laravelマイグレーションで複数のAutoIncrementカラムを定義する方法

この記事は公開から3年以上経過しています。

Laravel開発でマイグレーションを行う際に、複数のAutoIncrementカラムを定義する方法。

問題

スキーマビルダーのxxxincrements()autoIncrement()を使ってAutoIncrement型のカラムを定義しようとすると

PDOException::("SQLSTATE[42P16]: Invalid table definition: 7 ERROR: multiple primary keys for table "multiple_auto_increment_columns" are not allowed at character 101")

のようにプライマリキー重複エラーが発生してマイグレーションが失敗する。

// テーブル作成
Schema::create('multiple_auto_increment_columns', function (Blueprint $table) {
    // AutoIncrement(PrimaryKey)
    $table->increments('id');
    // AutoIncrement(PrimaryKey)
    $table->increments('sequence');
    // ダミー列
    $table->text('data');});

原因

スキーマビルダでテーブルの作成や編集を行うとxxxincrements()autoIncrement()で定義されたそれぞれのカラムにプライマリキー制約が自動設定される。

対応

生のSQLを使わずスキーマビルダーのみで対応する場合は、以下のようにテーブル作成とテーブル更新を分けてPrimaryKey制約の再設定を行う。

// テーブル作成
Schema::create('multiple_auto_increment_columns', function (Blueprint $table) {
    // AutoIncrement(PrimaryKey)
    $table->increments('id');
    // id列のPrimaryKey制約を削除
    $table->dropPrimary();
});

// テーブル更新
Schema::table('multiple_auto_increment_columns', function (Blueprint $table) {
    // AutoIncrement(PrimaryKey)
    $table->increments('sequence');
    // ダミー列
    $table->text('data');
    // sequence列のPrimaryKey制約を削除
    $table->dropPrimary();
    // id列にPrimaryKey制約を再設定
    $table->primary('id');
});

2回に分けるところがエレガントではなく微妙なのですが、生のSQLを使わない場合このような方法しか手がないようです…。

参考ウェブサイトなど

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする