エス技研

WordPress、CakePHP、PHP、baserCMSなどの Web系システムを中心に情報を提供します!


CakePHPで Auto Incrementを外すと Duplicate entry ‘0’ for keyのエラーが出るかも

      2024/06/21

CakePHPで「Duplicate entry ‘0’ for key」のエラーが出る不具合の事例

 

CakePHPで「Duplicate entry ‘0’ for key」のエラーが出た

 
CakePHP4で、コマンド処理の開発をしていたのですが、下記のエラーに遭遇しました。
 
2024-01-01 00:00:00 error: [PDOException] SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '0' for key 'PRIMARY' in C:\xampp4\htdocs\vendor\cakephp\cakephp\src\Database\Statement\MysqlStatement.php on line 39
 
2024-01-01 00:00:00 warning: The connection is going to be closed but there is an active transaction.
 
 
CakePHPで開発をしているときにこのエラーが出た方は「Auto Increment」の設定を変更していませんか?
 
この記事では、そんな「Auto Increment」の設定を変更した場合に発生する不具合についての解説記事で、エラーメッセージからは想像しにくいエラーでしたので、記事にすることにしました。
 
 

CakePHPで Auto Incrementの設定を外したときに発生する不具合

 
そもそもこのエラーが発生する状況はあまり多くないと言えるでしょう。
 
通常、CakePHPで開発をするシステムのテーブルの「ID」は「Auto Increment」を設定して自動附番の設定になっているかと思います。
というか、CakePHP単体で動作しているシステムの場合は「ID」に「Auto Increment」を設定しない理由がないかと思います。
 
ですが、他システムと連動しているシステムの場合、他システム側で付番をするので、CakePHP側のシステムでは「Auto Increment」を外す方がいい場合があります。
 
そんな外部システムと連携するシステムを構築する中で、最初は「Auto Increment」を付けていたけど、途中で「Auto Increment」を外す、と言うような場面があったとします。
 
そんな時に発生します。
 
 
例えば「/src/Model/Entity/Users.php」の「$_accessible」は下記のようになっています。
 

 
「Auto Increment」が設定されているときは、「ID」は自動付番されるため、「'id' => true,」は必要ないのですが、「Auto Increment」を外すと編集する項目として追加する必要があるのです。
 
ですが、「Auto Increment」を付けたり外したりする中で、「'id' => true,」を追記し忘れることがあるのです。
そうすると、先に紹介したようなエラーが発生します。
 
 
「Auto Increment」を外しただけなのでテーブル構造は変わっていないから、プログラムはほとんど変えないでいいだろう、みたいなことを思っていると陥りやすいような気がします。
 
 
'id' => true,」が付いていないことで、「id」が処理されませんので、1件目は「ID:0」で保存されます。ですが、1件目は正常処理されます。
ですが、2件目も「ID:0」で保存されますので、2件目で先のエラーが発生するのです。
 
そのため、「1件目は正常なのになぜ?」みたいな疑問も起こるのです。
 
 
もちろん、「'id' => true,」を追加するのではなく、テーブルの設定の方に「Auto Increment」を追加してもエラーは解消します。
 
 

IDをプログラムの処理で発行する場合の不具合の事例

 
ちなみに「Auto Increment」を設定せず、「ID」をプログラムの処理で発行するときはこんなエラーもありました。
 
「ID」の付番をプログラムの処理で行っていましたが、処理した結果の「ID」が「a」などのアルファベットになっていました。
数値であれば問題ないのですが、アルファベットのため、数値に変換できずに「0」として保存されました。先の例と同じく 1件目は重複しないので登録できます。
2件目の処理で「ID:b」を登録しようとすると、「ID:0」となるため、「『0』は重複してますよ」と言うエラーになって登録できない、と言うような不具合もありました。
 
 
先にも書きましたが、CakePHPでシステム構築をする場合、「Auto Increment」を使わないことが少ないと思いますので、この記事で紹介した不具合に出会うことはかなり稀なことだと思います。
 
逆に、稀だからこそ記事が少ないと思いますので、万一同じ状況になった方のお役に立てれば、と思っています。
 
 

「Duplicate entry ‘0’ for key ‘PRIMARY’ in XXXXXX」のエラーの一般的な解消方法

 
「Duplicate entry ‘0’ for key ‘PRIMARY’ in XXXXXX」と言うエラーは
「『PRIMARY』となる『ID』が重複しています」
という内容のエラーです。
 
Googleで「Duplicate entry ‘0’ for key ‘PRIMARY’ in C」で検索して見た結果
 
Googleで「Duplicate entry ‘0’ for key ‘PRIMARY’ in C」を検索した結果が上記の URLの内容なのですが、「IDが重複しているので重複しないように処理しましょう」と言う内容のものが多々あります。
 
エラーの内容を素直に受け取るなら、IDが重複していますということなので、重複しないようにすることがエラーの解消方法ですからね。
ですが、往々にして、IDを指定していない(自動処理している)ために、IDに何が入っているのかがよく分からっていないときに発生する場面が多いですね。
 
IDに何が編集されているか、それを見極めながらデバッグをするしかなさそうですよね。
 
 

Auto Incrementに関連する不具合で Rollbackできなかったエラー

 
ちなみに「The connection is going to be closed but there is an active transaction.」の方のエラーは、「コネクションは終了していますが、トランザクションは残っています」と言うワーニングです。
 
これについては、トランザクションを「Rollback」して終わらせたり、MySQLなどのデータベースを再起動したり、と言った感じの対処療法的な解決策を提示する記事がありましたが、これも「Auto Increment」に関連して不具合が発生し、「Rollback」できなかったために発生している不具合だと言えますね。
 
 

CakePHP4の関連記事

CakePHP4系でJSONレスポンスの処理ではwithStringBodyを使う。3との違い解説
CakePHP4、CakePHP5の「warning: DebugKit is disabling...」の対処方法
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
 
その他の「CakePHP4」に関する記事一覧
 
 

 - CakePHP 3.x 4.x 5.x

GoogleAdwords

GoogleAdwords

最後までお読みいただきましてありがとうございます。
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!

Message

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

下記の空欄を埋めてください。 * Time limit is exhausted. Please reload CAPTCHA.

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

※入力いただいたコメントは管理者の承認後に掲載されます。

  関連記事

CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()
CakePHP4で公開側と管理側のデザインテンプレートを分ける方法・setLayout()

CakePHP4でデフォルトのレイアウトファイル「default.php」は管理側に使用し、これとは別のデザインを公開側のページに設定したい、を実装する方法を解説。

CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ
CakePHP3のCakeDC/UsersのUserHelperでログアウトやreCAPTCHAをカスタマイズ

CakeDC謹製Usersプラグインの紹介。UserHelperを利用し、ログアウトのリンクや権限があるときのみ表示されるリンク、プロフィールページへのリンク、reCAPTCHAの設置方法などを解説。

CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説

CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつ、テンプレートファイル、設定情報ファイルの場所とそれらをカスタマイズする方法を説明します。

CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説

CakePHP3でCSVファイルをアップロードしレコードを追加、更新する処理の作成方法の解説。モデルとは直接関連しないフォームからCSVファイルをアップロードするため汎用的に使用可能。

CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども
CakePHP3のHtmlHelperのLink設定のまとめ。mailto、URL、Root/Homeのリンクなども

CakePHP3でHtmlHelperを使ってリンクの設定をする方法のまとめ。基本形からURLを指定、class、id、targetを指定、mailtoのリンク、画像をアンカーに、JavaScriptのダイアログなどの解説。

CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用
CakePHP3にデザインテンプレートBootstrapを導入する方法・friendsofcake/bootstrap-ui使用

CakePHP3にプラグイン「friendsofcake/bootstrap-ui」、デザインテンプレート「Bootstrap」を設置する手順を解説。Bootstrapの簡単な使い方やデフォルトのデザインとの混在方法なども解説。

CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説
CakePHP4の定数定義ファイルを環境変数によって本番と開発を振り分ける方法解説

CakePHP4で開発環境と本番環境とで違う設定ファイルを読み込ませて環境ごとに定数を切り替える方法を解説。Apacheのhttpd.confに環境変数を設定しそれを読み込み判別する。

CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法
CakePHP3のCakeDC/Usersでログインユーザの所有レコードのみ更新、削除する権限管理の設定方法

CakePHP3のユーザ管理、ログイン認証プラグイン「CakeDC/Users」の権限管理を行う方法やアクセスできるコントローラー、アクションを設定、所有権を持つレコードのみ更新できる設定方法を解説。

CakePHP3でassociatedを使って関連データをまとめて保存する方法(hasOne、hasMany、belongsTo)

CakePHP3で関連データをまとめて保存する方法。hasOne、hasMany、belongsTo等の関連データはassociatedを追加することでまとめて保存することができます。

CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合

アソシエーション(連携)している先のテーブルの項目で条件抽出する際の考え方と注意点をサンプルソースを用いて説明しています。