データベース千夜一夜第8回

データの加工命令(2)~レコードの削除と削除処理の注意点 長谷川裕行
有限会社 手國堂

特定のレコードを削除する

実際の処理では、テーブル内のレコードを削除するケースが頻繁にあります。先に紹介した全レコードの削除は後述することにして、まずは特定の1件以上のレコードを削除する方法を紹介しましょう。


- マスター保守で全件削除はまれ -

商品の販売結果や入庫在庫などの取引状況を記録するテーブルでは、一定の処理(1件の販売処理完了、1回の入庫または出庫処理完了など)が終わったらテーブル内の全レコードを削除して次の処理に備えることになります。しかし、「商品_mr」(ここでは練習用の「商品_dmy」)のようなマスターテーブルでは、通常すべてのレコードを削除することはありません。

むしろ、マスターテーブルの保守処理で「販売の終了した商品」や「退社・転勤した社員」など特定の数件のレコードを削除することの方が多いはずです。その場合、削除する対象のレコードが明確になっている場合とそうでない場合とがあります。


- WHERE句で条件を指定する -

特定のレコードを示すには、WHERE句で条件式を記述します。削除対象のレコードが明確であるということは、条件式で特定の1件を指定できるということです。マスターテーブルでは、通常、1件のレコードを特定するためにIDフィールドを使います。例では「商品ID」です。

ここでは、「商品IDフィールドの値が'35101'」のレコードを削除する例を示します。SQLは以下のようになります。

  DELETE 商品_dmy WHERE 商品ID = 35101

WHERE句で「商品ID = 35101」と条件を指定しているので、ただ1件のレコード「商品ID=35101/品名=焼肉プレート大」だけが削除されます。
この処理は、以下のようなSQLでも同じ結果となります。

  DELETE 商品_dmy WHERE 品名 = '焼き肉プレート大'

この場合、同じ品名のレコードが存在すれば、それも削除されてしまいます。IDフィールドでしか唯一のレコードを指定できません。



- 複数の行を削除する -

1件ではなく一定の条件を満たす複数のレコードを削除するには、削除対象のレコードをWHERE句の条件式で指定します。ここでは、「在庫数が5未満」の商品を削除することにします。

まずSELECT命令で、在庫数5未満のレコードを抽出してみましょう。

  SELECT * FROM 商品_dmy WHERE 在庫 < 5

このSELECT文に用いたWHERE句以下の条件式「WHERE 在庫 < 5」を、そのままDELETE文に適用します。ここでは単純にSQLだけを考えていますが、実際の処理ではレコードを削除する前にユーザーに削除されるレコードの内容を提示し、本当に削除してよいか確認しなければなりません。

その場合、通常は上記のようなSELECT文で削除対象となるレコードを抽出し、それを画面に表示するなどします。ユーザーが(確認を求めるダイアログボックスの[OK]ボタンなどをクリックして)削除を了解したら、その時点でDELETE文を発行します。



上記と同じ条件で抽出されたレコードを削除するには、以下のようなSQLを記述します。

  DELETE 商品_dmy WHERE 在庫 < 5



- 確認~削除の処理に注意 -


実際の処理でよくあるのが、SELECT文とDELETE文で条件式がそれぞれ異なってしまうというミスです。ソースコード中では、例に示したように明確に「< 5」などと記述することはありません。それまでの処理によって値の変化しているであろう変数を使い、例えばVisual Basicの場合なら、以下のような形で文字列の連結式を作るでしょう。

 1.ユーザーの入力した最低在庫数を変数に保存
  intMinNumber = CInt(txtMinNumber.Text)

 2.ユーザーに確認を求めるためのSELECT文を生成
  "SELECT * FROM 商品_dmy WHERE 在庫 <" & intMinNumber

 3.取得したレコードセット(削除されるレコード群)を表示

 4.ダイアログボックスでユーザーに確認を求める

 5.ユーザーが了解([OK]や[はい]ボタンをクリック)したら
   →実際に削除を実行するときのDELETE文を生成
    "DELETE 商品_dmy WHERE 在庫 <" & intMinNumber

 6.削除を実行

2.と5.の段階で、同じ条件を与えて異なるSQL(SELECTとDELETE)を実行することになるため、双方のSQL文で変数名の記述を間違えたり、その間の処理で変数(例ではintMinNumber)の値を変化させてしまったりすると、ユーザーが確認したレコード群とは異なるレコードが削除される可能性が生じます。

変数に値を保持しているため間違えることはなさそうに思えますが、ソース中ではSQLはアプリケーションの構造とは無関係なデータベース・エンジンに対する命令として扱われるため、SELECT文とDELETE文には何の関連もないと見なされます。十分注意しましょう。



トップページ
レコードの削除~DELETE命令
特定のレコードを削除する
マスター保守で全件削除はまれ
WHERE句で条件を指定する
複数の行を削除する
確認~削除の処理に注意
全行削除の2つの命令
DELETEとTRUNCATE TABLEの違いを試す
トランザクションの制御について
あとがき
Copyright © MESCIUS inc. All rights reserved.