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」は下記のようになっています。
1 2 3 4 5 6 7 8 9 |
protected $_accessible = [ 'id' => true, 'name' => true, 'password' => true, 'email' => true, 'created' => true, 'modified' => true, ]; |
「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」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でアソシエーション先のカラムでデータをソートして取得したい
アソシエーション先のテーブルのカラムをキーにソートをしたデータを取得したい!ときの記述方法を解説。「orderAsc()」ではなく「contain()」の中にSort条件を記述する。
-
-
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。
-
-
CakePHP4 でコマンドプログラム(シェルプログラム)を作成する方法解説
CakePHP4でバッチ処理を行うためのコマンド・シェルの実装方法について解説。bakeでテンプレートファイルを作成し、「execute()」に処理を記述する方法を解説。
-
-
CakePHP3のビューで受取ったテーブルのオブジェクトを連想配列に変換する方法
コントローラーからビューに送ったテーブルのオブジェクトを連想配列に変換し、ビューの中で自由に使えるようにするメソッド「toArray()」の解説。連想配列に変換できれば利用度アップ!
-
-
CakePHPで favicon.icoやapple-touch-icon-144-precomposed.pngが could not be foundのエラーが出るときの対処方法
CakePHPで「CakeDC/Users」などルーティングを行うプラグインを利用するときに、favicon.icoやapple-touch-icon-144-precomposed.pngがNotFoundエラーになることがある。その対処方法の解説。
-
-
CakePHP3のタイムゾーンを協定世界時UTCから日本標準時間JSTにずれを変更する方法
CakePHP3の標準設定のタイムゾーンは「UTC(協定世界時)」に設定されている。これを日本標準時に変更する方法(app.php、bootstrap.phpの変更方法)の解説。
-
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
-
CakePHP3の検索プラグイン「friendsofcake/search」の設置方法・CakePHP3.6対応
CakePHP3で検索を担うプラグイン「friendsofcake/search」の紹介。基本的な設置方法の紹介のほか、処理の記述方法のバリエーション、エラーの解説など。CakeDC/searchより導入は簡単!
-
-
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3で Insert … On Duplicate Key Update構文(upsert)を実行する方法を解説。バルク処理の方法も用意されているため大量処理の場合も対応可能。
-
-
CakePHP4、5の認証処理で認証が通らない際の確認方法と確認箇所の紹介
CakePHP4、5系の認証処理でログイン認証が通らない場合の確認方法、確認箇所を解説。ログ出力し、ステータスを確認するが、ステータスの内容も紹介。それはそのままusernameを変更する際のポイントでもある。