SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

GlassFishからアプローチするJava

GlassFishからアプローチするJava~入門編~
第6回「Webアプリケーションの作成 ON DELETE CASCADE」

買い物かごへの削除、更新機能の実装

ダウンロード サンプルコード (16.5 KB)

[レジへ進む]ボタンで一括削除

 本来であれば、レジへ進んだ後、送付先・請求先、支払方法の選択などを行い、購入が完了した時点で買い物かごを空にしなければならないのですが、そこまで実装すると本当にネットショップを立ち上げることができるくらいになります。しかし、その実装も今の数十倍になります。現実的ではないため[レジへ進む]ボタンをクリックした時点で購入まで行ったものと仮定します。

一括削除の方法

 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]をクリックします。

図8.カスケード削除するための設定変更画面
図8.カスケード削除するための設定変更画面

 少し分かりづらいと思いますが、左側が参照される側、つまりbasketテーブルを、中央が参照する側、つまりbasket_itemテーブルを示しています。図9がカスケード削除を行うための設定です。

図9.カスケード削除するための設定内容
図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)を選んではじめて、一括削除が可能となるのです。

次のページ
サンプルコード

この記事は参考になりましたか?

GlassFishからアプローチするJava連載記事一覧

もっと読む

この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4920 2010/03/10 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー