Update/Delete 文の Where 句 ~PowerBuilder 入門!!第 4 弾 (3)~

みなさん、こんにちは!
このブログは、「PowerBuilder ってなに?」、「PowerBuilder ってなにができるの?」という疑問に、IT 用語の解説もしつつ、簡単に分かりやすくお答えすることをモットーにしています。
気になる方はぜひ続きを見てみてくださいね。
キャラクター紹介

ねこぴ
PowerBuilder の新キャラクター?
(猫に見えるが) PowerBuilder の先生。
最近太った (?) ので夜は野菜が入った鍋をひたすら食べている。

ちまき
PowerBuilder をこれから学びたい開発初心者。
最近、甘いお酒より食事に合うお酒を選ぶようになったガール。
動画でも PowerBuilder について学習できます!
YouTube では、この PowerBuilder 入門シリーズの動画版を公開しています!
動画版では、実際の PowerBuilder の画面操作をしているところを確認しながら進められるので、より理解力が深まります。
あわせてぜひご視聴ください!
ある日の午後のこと・・・。

わあ~い!
この PowerBuilder 入門シリーズ、日々皆様からご好評いただいているみたいだにゃ。


そうだったにゃー!こっちもみんなに観てほしいにゃ!
ねこぴのかわいい素の声が聞けちゃうね☆


前回は更新機能の追加、そして更新特性の指定について解説したにゃ。
今回は「更新特性の指定」の「Update/Delete キーの Where 句 」について説明していくにゃ。
さて、第 4 弾のアプリ作成 3 回目です^^
どんなアプリだったかというと、人の名前や所属番号をデータベースから取得し、それを編集し、最後は更新ボタンをクリックしてデータベースに反映させるというものです。
更新と更新特性の指定まで終わっている方は下の画像まで進んでいるはずです。
(さぼってないよ・・・ね!\(^o^)/)

さっそくですが、「更新特性の指定」の解説の続きを・・・(^^)
今回のテーマは「Update/Delete 文の Where 句」についてです。下の赤枠部分ですね。

固有キーカラムで説明したように、データウィンドウの更新 (Update 関数) では、実際には SQL の UPDATE 文や DELETE 文が発行されます。その際に使用される WHERE 句のことです。
これですね↓
UPDATE 生徒テーブル SET C = 'えのもと' WHERE A = 1 AND B = 3;
ここで少し上記の SQL について解説をします(^^)
前回のブログにも出てきましたが、たとえば下のような生徒テーブル (A : クラス、B : 番号、C : 名前、D : 成績) があるとします。

生徒番号が懐かしい・・・
上記コードを参考にすると、UPDATE 文に関してはデータを更新するときの文になります。UPDATE の次に来るのはテーブル名です。つまりはこの「生徒テーブル」上のデータを更新します、といった形ですね。
「SET C = ‘えのもと’」というのは、C 列のカラムを「えのもと」に変更してください、という意味合いです。つまり生徒テーブルで C 列のどこかの名前を「えのもと」にする、という意味になります。
最後に「WHERE A = 1 AND B = 3」というのは A 列が 1 と B 列が 3 の値の箇所ということになります。つまり「生徒テーブル」の A = 1 AND B = 3 は「さとう」となっていますので、「さとう」を「えのもと」に更新してください、という意味です。このように的確にこの箇所を指すという条件のことを「固有キーカラム」と呼ぶのでしたね。
単純にテーブルのデータを更新する分には固有キーカラムのみで十分なのですが、場合によっては条件を追加することで、より便利になったりします。
何を言っているかアブラカタブラちんぷんかんぷんですので、分かりやすい例をもって解説したいと思います。
また先ほどの「生徒テーブル」をご覧ください。
このクラスは担任たけのこと副担任はるまきがいて、たとえば先ほどのテーブルを更新する処理をたけのこ先生とはるまき先生が同時に行ったとします。この時の状況は以下になります。
- たけのこ先生とはるまき先生が同時に検索する。この時点で 1 組 1 番ねこぴの「成績」は 2 人とも “5” と見えている。
- データウィンドウ上でねこぴの「成績」をたけのこ先生が “4” はるまき先生が “1” に変更する。
- ほぼ同時にデータウィンドウを更新するが、わずかながらたけのこ先生のほうが早かった。
この場合たけのこ先生がせっかく “4” に更新したのに、すぐ後にはるまき先生により “1” に変更されてしまいます。

はるまき、評価厳しくね?
そうすると、はるまき先生は 「“5” → “1” に変更した」という認識ですが、たけのこ先生は「“5” → “4” に変更したはずなのに・・・」と困ってしまいますよねΣ(・ω・ノ)ノ!
このように同時に更新をしたときに、利用者にとって想定しない変更が発生する場合があります。
内部的には下記のように SQL が発行されます。
[たけのこ先生]
UPDATE 生徒テーブル SET D = 4 WHERE A = 1 AND B = 1;
[はるまき先生]
UPDATE 生徒テーブル SET D = 1 WHERE A = 1 AND B = 1;
このような想定しない変更が発生しないように元の値が何だったのかを保持しておき、それを条件に追加します。
今回の場合は「成績」を追加すると下記のような処理の流れになります。
前提:検索時点ではねこぴの成績は “5” というのが 2 人の認識です。
- このデータに対し、成績をたけのこ先生は 4、はるまき先生は 1 と変更します。
- Update 関数により UPDATE 文が発行されます。たけのこ先生が先でした。
[たけのこ先生]
UPDATE 生徒テーブル SET D = 4 WHERE A = 1 AND B = 1 AND D = 5;
[はるまき先生]
UPDATE 生徒テーブル SET D = 1 WHERE A = 1 AND B = 1 AND D = 5;
ちなみにこのように違う人が同時に同じデータを更新することはないなーと (楽観的に) 想定して、データをロックはしないものの、同時に 1 つのデータを更新した際に後から更新した人が負けるようにすることを「楽観的排他制御」といいます( -`ω-)✧
「検索したときにはあったけど、更新しようとしたときにはない」という状態は、
条件となるカラムが更新されたか、データ自体が削除されたということです。
これにより、はるまき先生は「たけのこ、やりおったな」と分かるわけです。

はるまき、武士か何かなの?
このように、キー以外のカラムを条件に追加することで便利にするのが「Update/Delete 文の Where 句」の役割です。
それでは改めて「Update/Delete 文の Where 句」の項目について確認してみましょう!
- 「キーカラム」・・・条件は固有キーカラムのみ
- 「キーカラムと更新可能なカラム」・・・条件は固有キーカラムとデータウィンドウで検索しているすべてのカラム
- 「キーカラムと修正したカラム」・・・条件は固有キーカラムとデータウィンドウ上で変更されたカラムのみ
「キーカラムと更新可能なカラム」と「キーカラムと修正したカラム」の違いは、データウィンドウ上で使用しているすべてのカラムを条件として更新するか、修正されたカラムのみを追加して更新するかという点です。
今回の処理を例にすると、「キーカラムと更新可能なカラム」に設定した場合は
[たけのこ先生]
UPDATE 生徒テーブル SET D = 4 WHERE A = 1 AND B = 1 AND C = 'ねこぴ' AND D = 5;
というように、「AND C = ‘ねこぴ’」のような修正していないカラムも条件として追加されます。
これにより何が変わるのかというと、たけのこ先生が「成績」、はるまき先生が「名前」をそれぞれ変更して更新した場合にもはるまき先生は更新処理がエラーになります。
つまり「何らかのカラムが変更されたから、このデータは変更禁止」という動作になるということです。
一方で「キーカラムと修正したカラム」は、それぞれ変更されたカラムが別であれば更新が可能です。たとえば、
[たけのこ先生]
UPDATE 生徒テーブル SET D = 4 WHERE A = 1 AND B = 1 AND D = 5;
[はるまき先生]
UPDATE 生徒テーブル SET C = 'ねこぴよ' WHERE A = 1 AND B = 1 AND C = 'ねこぴ';
※C 欄にある「ねこぴ」を「ねこぴよ」という名前に変更したいという場合。
ちなみに、最初の例ではるまき先生があきらめきれずにやっぱりねこぴの成績をどうしても “1” にしたい場合は、検索しなおしてデータベースとデータウィンドウの値が同じ状態になってからであれば更新が可能になります。

いや、どんな状況?もはや嫌がらせじゃん!
おっと、キーカラムの更新について説明しようと思いましたが、長くなりそうなので次回説明しますね~

よく分かりました!
確かに更新したいっていう人間と人間の欲望がぶつかるときありますよね!

何の話だよ! (今回は総じてツッコミだったにゃ・・)
更新特性の指定は言葉がこんがらがるかもしれないけど、
今回でかなり分かりやすくなったと思うにゃ。
それでは、最後におさらい!
それでは、最後におさらいをしましょう。
- 結論
- Update/Delete 文の Where 句は、一斉に行う更新手続きがぶつからないように配慮できる
- 「キーカラム」・・・条件は固有キーカラムのみ
- 「キーカラムと更新可能なカラム」・・・条件は固有キーカラムとデータウィンドウで検索しているすべてのカラム
- 「キーカラムと修正したカラム」・・・条件は固有キーカラムとデータウィンドウ上で変更されたカラムのみ