この記事は公開から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を使わない場合このような方法しか手がないようです…。
参考ウェブサイトなど
- Laravel Docs
Database: Migrations
以上です。