EC-CUBE4 関連するデータがあるため「○○」を削除できない場合

そもそも消す必要があるのか分かりませんが使わない商品規格を消したいということなので消したいと思います。

 

そもそもなぜこの表示が出るのかというとこちらのリンクが詳しいです。

https://umebius.com/eccube/eccube4-product-foreign-key-constraint/

 

ということなので外部キー制約に該当するテーブルを突き止め、レコードを消していきます。

ここからは完全に自己責任のもとバックアップをとりながら作業を進めてください。

 

一発で外部キーとして使われているテーブルを見つける方法が他にあるのかもしれませんが、私はデータを削除しながらエラー文を見ていって突き止めました。

今回の「商品規格」の場合はテーブルを見ていくと

大規格: 「dtb_class_name」

中規格: 「dtb_class_category」

に入っているようでした。

管理画面からも消せないので当然DB側でも消せないですが先ほど言った通り、sql実行してエラー文を見ていきます。

中規格である「dtb_class_category」からデータを消していきます。すると以下のようにエラーが返ってきました。

 

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`DB名`.`dtb_product_class`, CONSTRAINT `constraint値` FOREIGN KEY (`class_category_id2`) REFERENCES `dtb_class_category` (`id`))

「dtb_product_class」テーブルの「class_category_id2」カラムで外部キーとして使われているということでなので「dtb_product_class」のレコードを消していきます。
そうするとまたエラーが返ってきました。

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`DB名`.`dtb_product_stock`, CONSTRAINT `constraint値` FOREIGN KEY (`product_class_id`) REFERENCES `dtb_product_class` (`id`))

先ほどと同じく、外部キーとして使われているということなので「dtb_product_stock」からレコードを消していきます。
するとレコードを消すことができました。ちなみにこのテーブルは管理画面でいうところの各商品規格登録のデータが入るようです。元から入っていたのか後から入れられたのか分かりませんが該当のデータを消します。
レコードを消せたのでさっきの順番を遡って消していきます。
「dtb_product_class」からレコードを消します。するとさっき消せなかったレコードが消せました。
データを見ると2017年のものもあるのでデフォルトで入っているものもありますね。。
このテーブルは確認はしてないですが、各商品規格の詳細設定の部分でしょうか。。
こちらも使わないデータは消していきます。
するとまたエラーが出ました。

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`DB名`.`dtb_order_item`, CONSTRAINT `constraint値` FOREIGN KEY (`product_class_id`) REFERENCES `dtb_product_class` (`id`))

「dtb_order_item」で使われているとのこと。こちらは受注管理テーブルでしょうか、テスト環境で受注履歴などないのでこちらのレコードも消していきます。
もう一度消しにいきます。
すると一番上のレコードが消せません。。

#1451 - Cannot delete or update a parent row: a foreign key constraint fails (`DB名`.`dtb_cart_item`, CONSTRAINT `constraint値` FOREIGN KEY (`product_class_id`) REFERENCES `dtb_product_class` (`id`))

こちらも対処します。
こちらのテーブルは最初の方で紹介したリンク先で説明されていますがカート内のテーブルのようです。

ようやく終わりました。当初の目標の商品規格を消すことができました。

今回の例はEC-CUBEをインストールした直後の対応ですので既に運用中であったりデータが大量にある場合などは十分に注意してください。