商売力開発ブログ

非エンジニアがWebサービスの開発、運営によって商売力をつける記録、その他の雑記

【スポンサーリンク】

LaravelのマイグレーションでPKの設定時に注意する

スポンサーリンク

今回はPHPフレームワークの一つのLaravelの中から、データベースのマイグレーションでのプライマリキー(以下、PK)の設定の注意事項について説明します。ユニークとインデックスから説明し、その後にPKについて説明します。

マイグレーションファイルでのユニークとインデックスの設定

以下はLaravelのマイグレーションファイルでのユニークとインデックスの設定例です。

    public function up()
    {
        Schema::create('samples', function (Blueprint $table) {
            $table->string('column_name1',5);
            $table->string('column_name2',5);
            $table->string('column_name3',5);
            $table->string('column_name4',5);
            $table->string('column_name5',5);
            $table->timestamps();
            
            //ユニーク設定
            $table->unique(['column_name1','column_name2','column_name3','column_name4']);
            //インデックス設定
            $table->index(['column_name2','column_name3','column_name4','column_name5']);
        });
    }

テーブルの定義の後にユニークとインデックスの設定をしています。基本的な設定方法はこの書き方になりますが、これを実行すると以下のようなエラーとなります。

$ php artisan migrate

SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name 'samples_column_name1_column_name2
_column_name3_column_name4_unique' is too long (SQL: alter table `samples` add unique `samples_column_name1
_column_name2_column_name3_column_name4_unique`(`column_name1`, `column_name2`, `column_name3`, 
`column_name4`))

これは自動で付与されるカラム名を連結したユニーク名称「samples_column1_column2_column3_column4_column5_unique」が長すぎるのが原因で発生しています。インデックスの設定についても同様の名称が設定されてエラーとなります。このため以下のようにして、名称を設定をします。

            //ユニーク設定
            $table->unique(['column_name1','column_name2','column_name3','column_name4'],'UNIQUE_NAME');
            //インデックス設定
            $table->index(['column_name2','column_name3','column_name4','column_name5'],'INDEX_NAME');

名称を設定することでエラーがなくなります。名称が設定されているかは以下のSQLで確認します。

select table_name,index_name,column_name,seq_in_index from information_schema.statistics
where table_name = 'samples';

結果は以下のようになっています。

table_name index_name column_name seq_in_index
samples UNIQUE_NAME column_name1 1
samples UNIQUE_NAME column_name2 2
samples UNIQUE_NAME column_name3 3
samples UNIQUE_NAME column_name4 4
samples INDEX_NAME column_name2 1
samples INDEX_NAME column_name3 2
samples INDEX_NAME column_name4 3
samples INDEX_NAME column_name5 4

マイグレーションファイルでのPKの設定

続いてはLaravelのマイグレーションファイルでのPKの設定例です。

    public function up()
    {
        Schema::create('samples', function (Blueprint $table) {
            $table->string('column_name1',5);
            $table->string('column_name2',5);
            $table->string('column_name3',5);
            $table->string('column_name4',5);
            $table->string('column_name5',5);
            $table->timestamps();
            
            //PK設定
            $table->primary(['column_name1','column_name2','column_name3','column_name4']);
        });
    }

これを実行すると以下のようなエラーとなります。

$ php artisan migrate

SQLSTATE[42000]: Syntax error or access violation: 1059 Identifier name 'samples_column_name1_column_name2
_column_name3_column_name4_primary' is too long (SQL: alter table `samples` add primary key `samples_column
_name1_column_name2_column_name3_column_name4_primary`(`column_name1`, `column_name2`, `column_name3`
, `column_name4`))

PK設定についてもユニークやインデックスと同じようにカラム名を連結した名称をつけるように動作しているようです。通常、PK設定の場合は「PRIMARY」となるのですが、この自動で設定された名称が原因でエラーとなります。この対応として、ユニークやインデックスと同じように名称を設定することで回避することができます。

            //PK設定
            $table->primary(['column_name1','column_name2','column_name3','column_name4'],'DUMMY_NAME');

SQLの結果は以下のようになっています。設定した「DUMMY_NAME」は出てきません。

table_name index_name column_name seq_in_index
samples PRIMARY column_name1 1
samples PRIMARY column_name2 2
samples PRIMARY column_name3 3
samples PRIMARY column_name4 4

ちなみに、以下のように「'PRIMARY'」として設定して実行しましょう。

            //PK設定
            $table->primary(['column_name1','column_name2','column_name3','column_name4'],'DUMMY_NAME');

すると以下のようなエラーとなります。これは「PRIMARY」はインデックス名称としては使用できないためです。

$ php artisan migrate

SQLSTATE[42000]: Syntax error or access violation: 1280 Incorrect index name 'PRIMARY' 
(SQL: alter table `samples` add primary key `PRIMARY`(`column_name1`, `column_name2`, `column_name3`
, `column_name4`))

PKの設定では通常は名称の設定は不要ですが、エラーとなった場合はダミーの名称を設定することで回避することができます。ここに注意してマイグレーションファイルを設定しましょう。

まとめ

今回はLaravelのマイグレーションのPK、ユニーク、インデックスの設定を説明しました。

以上

【関連するリンク】 www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz www.prj-alpha.biz

【スポンサーリンク】