Laravelで主キー/プライマリキーを文字列などに設定する方法

主キー(プライマリキー)は普通は次を使います。

  • カラムはunsigned bigint型
  • オートインクリメント

この主キーを文字列にしたい場面がありました。

Laravel Eloquentでの変更方法をまとめます。
具体的なテーブル名とコードを出すなら次の通りです。

ここで作りたい文字列が主キーなテーブル構造

ここでは次のテーブルを作りたいとします。

▼ 例えば名前をproductsテーブルとする

カラム名 データ型 補足
id varchar(30) 主キー
name varchar(100)

この場合はidカラムの値が絶対に重複しないという前提でのテーブル設計にしたいと思います。(例えば数字以外を含むIDだったりとか)

もちろんオートインクリメントするbigint型のidカラムを作り、別途uniqueなカラムを作る手もあるけど、ちょっと無駄が多い気がします

まずはmigrationから主キーを指定してテーブル作成

ではLaravelで具体的に作っていきます。

▼ まずartisanからmigrationを作成

▼ こういう内容でmigrateしてみる

こういう感じですね。

上記コードでは  $table->id();  をコメントアウトして、代わりに $table->string('id', 30)->primary();  とすることでプライマリキーを設定しています。

ちなみに文字列の長さについては長くしすぎないことを推奨します。最後あたりにも書くのですが、MySQLのとある成約に引っかかる可能性もあるためです。

そして php artisan migrate  を実行。

ひとまずテーブルができあがりました。

Modelクラスにて主キーを変更するコード追加

これだけでは不十分です。

お次はModelクラスで主キーを変えたことを明示します。

▼ 先ほどのテーブル用のModelを作成

▼ このように主キー変更を明示しておく

Modelクラスでは $primaryKey でプライマリキー名を管理してるみたいです。あと文字列だから $incrementing = false; としてオートインクリメント無効化してます。

あとLaravel6.9以降なら $keyType で主キーの型がなんなのかも指定しておくべき。あとは特に言うべきことはありません。

主キーは一意になるなら文字列でもなんでもOK

これはLravelというよりSQLの話ですが・・・

プライマリキーには次のようなルールがあります。

  • 主キーはINTEGERである必要はない
  • オートインクリメントする必要もない
  • 一意になるなら文字列でも何でもOK

Laravelでも上記の方法で主キーを文字列に設定できます。

ただし文字列の主キーでは長さ上限に注意が必要!

ただ文字列を主キーにするなら長さには要注意です。

実はユニークキーには次の制約があります。

  • ユニークキーが文字列として定義されてる場合
  • そしてvarcharなどの可変長型を使ってる場合
  • その長さは767バイトまでに制限されてしまう

MySQLにはこういうルールがあるみたいです。

詳しくは次記事でも解説したのでご覧ください。

主キーが varchar(100) 程度なら問題ありません。

でも長めの文字列を主キーに使うなら気を付けるべきです。

以上、Laravelで主キーを文字列にする方法でした。

ではまた バイバイ(@^^)/~~~