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

データの加工命令(3)~フィールドの一括更新と基本命令群のおさらい 長谷川裕行
有限会社 手國堂

様々なフィールド更新処理

UPDATE命令では、WHERE句によって対象レコードを絞り込めます。また、すべてを同じ値にするのではなく、計算式を使ってフィールドの元の値に応じた異なる値を設定することもできます。


- WHERE句による絞り込み -

先の例のように全レコードを更新の対象とするのは、在庫の整理や年間の締め処理など特別な場合になります。通常の業務では、一定の条件を満たすレコードを絞り込んでそれだけを対象に値を更新することが多いでしょう。

UPDATE命令もDELETE命令と同じように、WHERE句で条件を指定して対象のレコードを絞り込めむことができます。

  UPDATE <テーブル名> SET <フィールド1>=<値1>, <フィールド2>=値2, ...
  WHERE <条件式>

「商品_dmy」テーブルの「商品ID=601201、品名=スリム化粧台(ブラウン)」の在庫数だけを「10」に更新するなら、以下のようなSQLを記述します。

  UPDATE 商品_dmy SET 在庫=10 WHERE 商品ID=601201





- 複数レコードを一括更新する -

もちろんWHERE句の条件式では、「<」や「>」あるいはテキスト型フィールドにLike演算子を適用するなどして、複数のレコードを対象とすることもできます。

在庫数が5以下のレコードの在庫数を一斉に「20」にしてみましょう。SQLは以下のようになります。

  UPDATE 商品_dmy SET 在庫=20 WHERE 在庫 <= 5

先に在庫数を10に更新した「商品ID=601201、品名=スリム化粧台(ブラウン)」以外のレコードが対象になり、それらの在庫数が一斉に20になります。




- 計算式で値を設定する -

UPDATE命令では、単にフィールドに固定された値を設定するだけではなく、「現在の値を元にした計算式」も設定できます。例えば、商品の価格を外税から内税に変更するため全商品の販売単価を一律5%上げるなら、以下のようなSQLを記述できます。

  UPDATE 商品_dmy SET 販売単価=販売単価*1.05

こうすれば、販売単価が1,000円のレコードは販売単価が1,050円に、2,000なら2,100円に……という具合に、更新前の値を元に計算された新たな値が設定されます。




- 更新処理での注意 -

UPDATE命令による更新処理も、テーブルの内容を書き換えてしまいます。実際の業務処理で使用する場合、DELETE命令と同じようにユーザーへの確認を求めるなどの注意が必要です。

DELETE命令によるレコードの削除では、削除する前に「削除対象のレコードをあらかじめSELECT命令で抽出してユーザーに提示する」といった処理を付け加えることになりますが、UPDATE命令では単にレコードを提示するだけではなく「どのレコードのどの値が、どのように書き換えられるのか」を示す必要があります。

先の「全商品一斉価格改定」のような処理では「すべての商品の販売単価を一律5%加算します」のようなメッセージだけでも構わないでしょう。しかし、特定の商品の在庫数を一斉に「0」にするような場合は、更新対象のレコードを一覧表示する方が親切です(もちろん、処理内容やレコードの件数によっては、画面表示の代わりにプリンタで印刷したり、ログファイルを出力したりする方がよい場合もあります)。

そのような場合には、DELETE命令の場合と同じように、先に処理対象のレコード群を提示するためのSELECT文と実際に値を更新するUPDATE文との間で、レコードの抽出条件が異ならないように配慮しましょう。



トップページ
フィールドの更新処理~UPDATE命令
様々なフィールド更新処理
WHERE句による絞り込み
複数レコードを一括更新する
計算式で値を設定する
更新処理での注意
基本命令のおさらい
新しいサンプルデータベースの準備
あとがき
Copyright © MESCIUS inc. All rights reserved.