EC-CUBE3でサイトをしばらく運営していると、Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘32767’ for key ‘PRIMARY’ というエラーが発生することがあります。
これはオートインクリメント(MySQL風)するプライマリーキーが、その型の上限値に達してしまった時に発生するエラーです。
EC-CUBE3でなぜ発生する?
‘32767’という数字でsmallintだとすぐにわかる方も多いと思いますが、EC-CUBEサイトではsmallintの上限値を比較的簡単に超える場合があります。
例えば公式の関連商品プラグインのidがsmallintになっているのはEC-CUBE界隈では有名な話ですが、5000商品に関連商品を6~7個ずつ設定すると簡単に上限値を超えてしまいますね。
商品登録ボタンを押すとplg_related_product テーブルのIDが維持されず新しく発行される仕様のため、想像以上にあっさり超えてしまいます。
対策としてはプライマリーキーの型をsmallintからintegerに変更することとなります。
関連商品プラグイン程度であれば簡単ですが、もしそのカラムに対して外部キーのリレーションがある場合は、リレーション先も全て型を変更していく必要があるため主要テーブルの型変更だと重作業になる可能性があります。
EC-CUBE4関連商品プラグインでは?
現行のEC-CUBE4向けプラグインではすでにidのタイプはintegerに修正されています。
もしもinteger型の最大値に達してしまった場合は次のようなエラーとなります。
Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry ‘2147483647’ for key ‘PRIMARY’
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。