[レジへ進む]ボタンで一括削除
本来であれば、レジへ進んだ後、送付先・請求先、支払方法の選択などを行い、購入が完了した時点で買い物かごを空にしなければならないのですが、そこまで実装すると本当にネットショップを立ち上げることができるくらいになります。しかし、その実装も今の数十倍になります。現実的ではないため[レジへ進む]ボタンをクリックした時点で購入まで行ったものと仮定します。
一括削除の方法
basketテーブルから該当するユーザidを持つレコードを削除すれば、それに結び付くbasket_itemも全て削除されそうに思いますが、実際には削除されません。今のbasket_itemテーブルの作りでは、basketテーブルのidを持っているbasket_itemテーブルのレコードを全て削除し、そのあと該当するbasketテーブルのレコードを削除しなければなりません。この場合であればbasketテーブルとbasket_itemの特定のユーザに関連するレコードを全て削除しても大きな負担にはなりませんが、より深い階層になると削除ロジックが複雑になります。
このような場合、ほとんどのデータベース製品はカスケード削除ができるようになっています。カスケード削除とは大元を削除すれば、それにぶら下がったものも削除されることを指します。今回は意地悪くbasket_itemテーブルを作成するときに、カスケード削除ができるようには指定しませんでした。とは言っても、大がかりな修正が必要なわけではなく、MySQL Workbenchでbasket_itemの定義を変更するだけで済みます。
MySQL Workbenchで[SQL Development] → [Open Connection to start Querying]と選択肢、その下にあるコネクションをダブルクリックします。まだコネクションを作成していない場合、[New Connection]でコネクションを作成してください。難しい設定ではないことと、今まで添付していたサンプルコードに含まれていた設定ファイルを見れば分かるはずです。コネクションをダブルクリックすると[SQL Editor]タブが開き、その中ほどに[Overview]があります。一から作成した方は4つのスキーマが表示されており、その中に[imoshop]というタブがあるはずです。そのタブをクリックすると、basket、basket_item、meigara、userテーブルが表示されているはずです。basket_itemを右クリックし[Alter Table]を選択します。図8のように、左上に[basket_item]と表示された画面が開きます。下の方にたくさんのタブがありますが、[Foreign Keys]をクリックします。
少し分かりづらいと思いますが、左側が参照される側、つまりbasketテーブルを、中央が参照する側、つまりbasket_itemテーブルを示しています。図9がカスケード削除を行うための設定です。
図9のBがbasket_itemとbasketテーブルを結び付けるための設定です。つまりbasket_idがbasketテーブルのid項目であることを定義しています。Bのbasket_idの隣にidとありますが、その上に「Referenced Column」となっており、この項目(つまりbasket_id)がidという項目と結び付くことを定義しています。左側の「Foreign Key」にidとあり、まさしく中央でidと指定した項目です。idという項目がどのテーブルに属するものであるかを示すのが「Referenced Table」です。basketテーブルを指定(図9のA)して、basket_idがbasketテーブルのidと結び付くことを定義しているわけです。
ただこれだけでは、単にbasketテーブルとbasket_itemテーブルの関連を定義したに過ぎません。右側にある「On Delete:」というセレクトボックスから「CASCADE」(図9のC)を選んではじめて、一括削除が可能となるのです。


