エス技研

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の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」に関する記事一覧
 
 

 - CakePHP 3.x 4.x

GoogleAdwords

GoogleAdwords

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

Message

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

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

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

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

  関連記事

CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法
CakePHPで同一テーブル内の値を比較する条件でレコードを取得する方法

CakePHPの同一テーブルにある項目の値を比較し条件に合致するレコードを取得する方法を解説。[”項目名”=>”値”]ではなく[”項目名 = 項目名”]と書くところがポイント。

CakePHP3のアソシエーション機能を使い関連レコードをまとめて削除

CakePHP3でレコードを削除する際に関連するレコードをまとめて削除する機能の解説。フレームワークのメリットを存分に発揮し、コマンドを1行追加するだけで実装可能。

CakePHP3のcontroller内でテンプレート、レイアウトを変更する際の指定方法

CakePHP3でテンプレートファイルやレイアウトファイルをデフォルトのものから別のものに変更したい場合の指定方法を解説。

CakePHP 2.3で PDFを作成する方法を調査「mpdf」「TCPDF」「FPDF」

CakePHPで PDFを編集、出力するには「mpdf」「TCPDF」「FPDF」といったプラグインがあり、使い勝手を比較検討しました。TCPDFが一番良さそうでした。

CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法
CakePHP3チュートリアルで日付と時刻のDateTimeでエラーが出たときの対処方法

CakePHP3のブックマークチュートリアルには記載ミスもあり、そのまま動かない個所もある。CakePHP3では namespaceを使うようになったので、classを呼び出すときに¥を追加する必要が!

CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説
CakePHP4のフラッシュメッセージの表示場所、デザインを変更する方法を解説

CakePHP4のエラーメッセージ、完了メッセージなどを表示するフラッシュ処理の解説。Controller、レイアウトファイル、テンプレートファイルでそれぞれ処理を指定する。

CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法
CakePHP4のFrozenDateで1ヵ月前、先月、今月1日、来月末の日付などを算出する方法

CakePHPには「FrozenDate」の日付を扱う関数が用意されている。これを利用して、1ヶ月後、月末日、月初日、5日後などを指定して日付を取得できる。それを解説。

CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法

CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングをする方法を解説。インストール方法、読み込み方法。および、具体的なスクレイピングを実行するサンプルソースも。

CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)
CakePHP3のメッセージ日本語化の設定(国際化と地域化の機能の使い方の解説)

CakePHP3の英語のメッセージを日本語化(多言語化)する手順を解説。オリジナルのメッセージを作成する方法やプログラムで文言を追加する場合の対応なども解説。

MySQL、CakePHP 2.3で「tinyint(1)」の Boolean型の動作を再確認

MySQL+CakePHPの環境で「tinyint(1)」を利用する際の動作を検証。「tinyint(1)」の Boolean型について CakePHPでは自動処理が実施されていることを確認しました。