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」は下記のようになっています。
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の関連記事
CakePHPのpostlinkで生成した削除リンクをクリックしても処理が実行されない対処法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」に関する記事一覧
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。
-
-
getParam('action')で取得するアクション名は別関数に移動しても不変CakePHP4系、5系では「getParam()」で処理中のアクション名を取得できる。そのアクションから別関数を呼び出してた関数でアクション名を調べたが同一の名称だった。
-
-
CakePHP5でヘルパーから他のヘルパーを読み込む方法・CakePHP4からの変更点
CakePHP5のヘルパーで他のヘルパーを読み込む方法を解説。公式の日本語CookbookはCakePHP4のソースのままで間違っているため注意が必要。CakePHP4からの移行の際も同じ点に注意が必要。
-
-
CakePHP 2.3 Search Pluginで検索処理 その3入力エリア一つで複数の項目を同時に検索する方法
CakePHPの検索プラグイン Search Pluginの検索処理の中で入力エリア一つで複数の項目を同時に検索する方法を解説。
-
-
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。
-
-
CakePHP 2.3でファイルのアップロード処理を作る
CakePHPでプラグインを使わないファイルアップロード処理を解説します。簡単です。DBにファイルを格納する方法も。
-
-
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールする
CakePHP4、CakePHP3でブラウザにキャッシュさせる設定の解説。CSS、JavaScript、画像をブラウザにキャッシュさせるのか、定期的にリロードする設定にするのかの設定が可能。
-
-
CakePHP 2.3 Search Pluginで検索処理 その6ORDER、sortソートの機能
CakePHPの検索プラグイン Search Pluginの検索処理の中で order、ソートについての解説です。
-
-
CakePHP 2.3 連携先のテーブルの項目で条件抽出する場合
アソシエーション(連携)している先のテーブルの項目で条件抽出する際の考え方と注意点をサンプルソースを用いて説明しています。
-
-
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でCSVファイルをアップロードしレコードを追加、更新する処理の作成方法の解説。モデルとは直接関連しないフォームからCSVファイルをアップロードするため汎用的に使用可能。