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のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法CakePHP4のcake cache clear_allでPermission deniedはパーミッションの変更が必要
CakePHP4のクリエビルダーを使用してOR条件をAND条件でつなぐSQL文を作る方法
CakePHP4のController内でViewテンプレート、レイアウトの変更設定を記述する方法
CakePHP4から外部のデータベースにアクセスする方法解説
CakePHP4の数値項目は「like %10%」の部分一致検索(find select)はできない
CakePHP4でロギングスコープやログレベルを使用してログを出し分ける方法を解説
CakePHP2、CakePHP3、CakePHP4、CakePHP5のバージョンを調べる 2つの方法
Windows上のXAMPP環境のCakePHPのコマンド実行時に環境変数を指定する方法
CakePHP4で複数の引数(パラメータ)を付与してコマンドを実行する方法
その他の「CakePHP4」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
CakePHP4のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつ、テンプレートファイル、設定情報ファイルの場所とそれらをカスタマイズする方法を説明します。
-
CakePHP4で定数の設定と呼び出し方法の解説(defineとConfigure)
CakePHP4で定数を設定、使用する方法を解説。定数定義はdefineとConfigureを使用する方法を解説。また、bootstrap.phpに直接記述する方法と別のファイルにする方法を解説。
-
CakePHP3で生の SQLの実行はConnectionManagerを使う
CakePHP3で生の SQL文を実行する方法を解説。クリエビルダーを使う場合は TableRegistryを利用するが、SQLを実行する場合は ConnectionManagerを使う。プリペアードステートメントの使用方法も解説。
-
CakePHP4のCakeDC/Usersの Usersへの接続、バリデーションのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。CakePHP4で使う場合のUsersのカスタマイズとして入力項目のバリデーションの変更を、プラグインのファイルは触らずオーバーライドにより実装する方法を解説する。
-
CakePHP 2.3 デバッグキット(DebugKit)超初心者向けフォロー講座
CakePHP初心者に向けてデバッグキット(DebugKit)のインストール方法、はまりポイントを解説。
-
CakePHP3で画像・ファイルのアップロード処理を自作・解説付き・その2
ファイルのアップロード機能の自作サンプルコードとその解説のその2。アップロード機能に関連するファイルの更新や削除の処理や画像、フォルダのパスの指定方法などを含めて解説。
-
CakePHP 2.3 コマンドラインからPHPのシェル実行の方法解説
CakePHP 2.3でコマンドラインから CakePHPで記述した処理を実行する方法を解説します。
-
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!
-
CakePHP3でQRコードを作成、表示するライブラリ「cakePHP-QR-Code-Helper」
CakePHPでQRコードを生成するライブラリ「cakePHP-QR-Code-Helper」の紹介。GDライブラリのインストールも必要ないHelperとして提供されているため、ファイルを設置すればすぐに使用可能。
-
CakePHP3でkeywords、DescriptionをHTMLヘルパーを使って設定する
CakePHP3のkeywordsとdescriptionを設定する方法の解説。CakePHP3にはmetaタグを編集するHTMLヘルパーが用意されているためそれを利用すればOK!ポイントはブロック化を有効にすること。