今回は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