Laravel: Unable to create table without a primary key
sql_require_primary_keyが有効な環境でLaravelマイグレーションが失敗する原因と解決策
概要
DigitalOcean Managed DatabasesやPlanetScaleなど、sql_require_primary_keyが有効なMySQL環境でLaravelマイグレーションを実行すると発生するエラー。2020年6月以降、DigitalOceanはレプリケーションのパフォーマンス問題を防ぐため、この設定を強制しています。
エラーメッセージ
SQLSTATE[HY000]: General error: 3750 Unable to create or change a table without a primary key,
when the system variable 'sql_require_primary_key' is set.
Add a primary key to the table or unset this variable to avoid this message.
原因
- sql_require_primary_key有効化: マネージドDB環境でPKが必須
- Laravelの2段階クエリ: テーブル作成とPK追加が別クエリで実行される
- 文字列PKの問題:
$table->string('id')->primary()のような書き方で発生
問題のあるマイグレーション
| |
解決策
1. primary()をカラム定義と同時に指定(推奨)
| |
2. UUIDを使う場合
| |
3. 標準のid()を使う(最も安全)
| |
4. Laravel 7.x以降にアップグレード
Laravel 7.x以降では、この問題が修正されています。primary()の呼び出しがカラム定義と同じクエリで実行されるようになりました。
| |
5. sessionsテーブルの修正
databaseセッションドライバを使う場合:
| |
6. 一時的にsql_require_primary_keyを無効化(非推奨)
開発環境でのみ使用してください:
| |
注意: マネージドDB環境では権限がなく実行できないことが多いです。
影響を受けるマネージドDB
| プロバイダ | 状況 |
|---|---|
| DigitalOcean | 2020年6月以降、強制有効 |
| PlanetScale | デフォルト有効 |
| AWS RDS | 設定可能(デフォルトは無効) |
| Google Cloud SQL | 設定可能 |
よくある間違い
$table->primary('column')を別行で書く- 中間テーブル(pivot)にPKを付けない
sessions、cache、jobsテーブルのPK漏れ
参考リンク
関連エラー
関連エラー
PHP の他のエラー
この記事は役に立ちましたか?