EC-CUBEの案件で、既存の4800商品に商品規格を設定する作業があったのですが、EC-CUBEには複数の商品に一括で商品規格を設定する機構がありません。
さすがに4800商品に対して、画面変遷をともなうUIで規格を設定していくのは悲惨なので自前で実装したのですが、規格の設定自体は成功したものの、その作業後に「新規の商品登録ができなくなる」という問題が発生しました。
今回はその原因と解決方法をメモしておきます。
問題の発生
4800商品に対しサイズという9通りある規格を追加するのは、規格なしの商品登録時に作成されるdtb_products_classのレコードから複製して、class_category_id1の値を1から9 *1 のデータを追加しました。
また、EC-CUBEではオートインクリメントではなく、わざわざ○○_id_seqというテーブルで最新のID値を保持していると理解していたので、dtb_products_class_product_class_id_seqの値を4800→48000に書き換えました。
これで4800ある商品に商品規格が追加されたところまでは良かったのですが、それ以降新規の商品登録ができなくなってしまったというわけです。
まずはEC-CUBEで取得しているログをチェックしました。
すると、dtb_products_classテーブルのINSERTでDuplicate entryエラーが出ていました。
本来であればdtb_products_class_product_class_id_seqの値をインクリメントして48001を追加するdtb_products_classのレコードに入れなければならないのに、4801が追加されてしまいます。おかしいですよね。
しかも、エラーを繰り返すたびにこのidは4802,4803とインクリメントされていきます。dtb_products_class_product_class_id_seqの値は大きいままなのに・・・。
問題の原因
最初はdtb_products_class_product_class_id_seqの値がファイルにキャッシュされてるんじゃないの?*2 と思ってキャッシュをチェックしたりしましたが、さすがにそれはなかった。
でも盲点でしたね。
dtb_products_class_product_class_id_seqにはオートインクリメントが設定されていて、レコードのsequenceというフィールドの値ではなく、オートインクリメント値を利用していることがわかりました。
じゃあsequence意味無いじゃん。
私にはなぜこのような実装なのか理解できませんが、多分なにか理由があるんでしょう。ともかく○○_id_secはレコードの値ではなくオートインクリメントの値を参照していることに注意しましょう。