キーカラムの更新 ~PowerBuilder 入門!!第 4 弾 (4)~
![](/images/2023/08/566cfc6ece40f6abf840ce3a25dc7a21-1.png)
みなさん、こんにちは!
このブログは、「PowerBuilder ってなに?」、「PowerBuilder ってなにができるの?」という疑問に、IT 用語の解説もしつつ、簡単に分かりやすくお答えすることをモットーにしています。
気になる方はぜひ続きを見てみてくださいね。
キャラクター紹介
![ねこぴ自己紹介](/images/2022/05/nekopi-1.gif)
ねこぴ
PowerBuilder の新キャラクター?
(猫に見えるが) PowerBuilder の先生。
最近、ドライピスタチオにはまっている。
![ちまき自己紹介](/images/2022/03/girl_smile.png)
ちまき
PowerBuilder をこれから学びたい開発初心者。
最近、料理の動画を見るのが好き。ただし自分では作らない。
ある日の午後のこと・・・。
![ねこぴ叫ぶ](/images/2022/05/nekopi-1.gif)
あっつーい夏もそろそろ終わりに近づいてるにゃ。
アイスを何本食べたかもう分かんないレベルだにゃ。
![ちまき笑う](/images/2022/05/girl_laugh-1.png)
本当ですね・・・
私は変わり種アイスを食べましたよ!ほやアイスに焼きナスアイス・・・
あ、なんかねこぴ先生って焼きナス似合いますね!
![ねこぴ驚く](/images/2022/05/nekopi-1.gif)
どゆこと・・・?
ではここはスルーさせてもらって今日の授業だにゃ。
![ちまき笑う](/images/2022/05/girl_laugh-1.png)
さっそく PowerBuilder の勉強を始めましょうか!
前回は 「基礎的なアプリを作ってみよう(3)」 でしたよね。
![ねこぴ説明](/images/2022/05/nekopi-1.gif)
更新特性の指定の「Update/Delete キーの Where 句」について説明したにゃ。
今回は更新特性の指定の「キーカラムの更新」について解説していくにゃ。
さて、第 4 弾のアプリ作成 4 回目です^^
どんなアプリだったかというと、人の名前や所属番号をデータベースから取得し、それを編集し、最後は更新ボタンをクリックしてデータベースに反映させるというものです。
Update / Delete キーの Where 句まで終わっている方は下の画像まで進んでいるはずです。
特に前回から画面周りに変化はないですね\(^o^)/
![アプリ画面](/images/2022/06/PB190_i8ytn3VkQp.png)
さっそくですが、更新特性の指定の解説の続きを・・・(^^)
今回のテーマは「キーカラムの更新」です。以下の赤枠線部分ですね。
![キーカラムの更新](/images/2022/06/PB190_mTbGOPKaVZ.png)
そもそもキーカラムというのは、そのテーブルで一意になるカラムです。一意というのはその値は不変であり、それだけで値を特定できるという意味で、例えば学籍番号とかですね。 2 年 2 組 1 番というと誰か分かるようになっていますよね。またその番号に該当する人は 1 人しかいません。
つまり一意のカラムというのは、そのカラムさえあればどのデータか特定できるカラムということですね。
こういったカラムをキーカラム、もしくは主キーと呼んだりもします。
ちなみに一意のカラムは、1 つの場合もありますが複数カラムの組み合わせの場合もあります。例えば、クラスと番号だけで生徒が特定できる場合、2 組 (クラス) 2 番 (番号) と 2 つのカラムの組み合わせが一意であるということになります。
これを複合キーといいます。
「キーカラムの更新」は一意のカラムが更新された場合、どのようにデータを更新するかを設定します。
なぜこういった設定が必要なのか?
上記内容を踏まえた上で「Delete 文の後 Insert 文を使用」と「Update 文を使用」について説明したいと思います。「Delete 文の後 Insert 文を使用」に関しては以下の例を考えてみましょう。
![生徒テーブル](/images/2022/05/student_list_one-1.png)
生徒テーブル
たとえば右のような生徒テーブル (A : 学年、B : クラス、C : 名前、D : 成績) があります。
事前にお伝えしますが、このテーブルで主キーというのは A の学年と B のクラスになります。 A と B がどちらも分かることで、C の名前が誰か特定できるからです。こちらが先ほど説明した複合キーというやつです(^^)/
このテーブルで 1 組 3 番のねこぴくんが 2 組に編入するとします。
![なす叫ぶ](/images/2022/05/202806.png)
やだー!
![ねこぴ怒る](/images/2022/05/nekopi-1.gif)
誰や今いやー!いうたやつ!!!!焼きナスやないか!
![想定生徒テーブル](/images/2022/05/student_list_two-1.png)
「番号」が五十音順に採番されている場合、2 組内の「番号」の振り直しが必要になりますね。
左のような想定です。
このケースで振り直しをするには、2 つの UPDATE 文が必要ですね。
[ねこぴを 2 組に]
UPDATE 生徒テーブル SET A = 2 WHERE A = 1 AND B = 3;
[やたべを 4 番に]
UPDATE 生徒テーブル SET B = 4 WHERE A = 2 AND B = 3;
ここで上記の SQL の解説を・・・(^^)
「UPDATE 生徒テーブル」というのは、生徒テーブルというテーブルに対して更新をします、ということですね。
次にねこぴとやたべのそれぞれで「SET」という文字が見えますが、これはそれぞれ「A を 2」、「B を 4」に値を変更してください、という意味です。
最後は条件の WHERE 句ですね。例えば、ねこぴの場合は「A が 1」かつ「B が 3」という値 (行) の部分、という意味合いになります。
つまり [ねこぴを 2 組に] する場合の SQL は、生徒テーブルの A = 1 かつ B = 3 のねこぴの [番号] A に 2 をセットする、という意味になります。
すると困った事態が発生します。
一時的に「A が 2、B が 3」となるデータが 2 件できてしまうのです。
先ほど説明した通り、A、B の組み合わせが主キーに設定されているため、[ねこぴを 2 組に] の処理の時点で 「キー重複エラー」 になります。
更新の順番を変えればいいのですが、自動でそこまでできる機能もなく、また今回は 2 件のみの更新ですが、大量のデータになってくると順番を気にして更新するのは面倒です。
そこで活躍するのが「Delete 文の後 Insert 文を使用」です。
その名の通り、データを「更新」するのではなく、一度データを削除してから改めてデータを追加します。
-
[ねこぴを削除]
DELETE FROM 生徒テーブル WHERE A = 1 AND B = 3;
-
[やたべを削除]
DELETE FROM 生徒テーブル WHERE A = 2 AND B = 3;
-
[ねこぴを追加]
INSERT INTO 生徒テーブル VALUES (2, 3, 'ねこぴ', 1);
-
[やたべを追加]
INSERT INTO 生徒テーブル VALUES (2, 4, 'やたべ', 5);
このように SQL 文を内部的に発行してくれるのです。これならデータを追加するときに 2 組 3 番のデータは削除されているため重複は起こりません。
キーを更新できる処理では上記のようなことが起こり得るので、「Delete 文の後 Insert 文を使用」に設定しておけば安心です。
![ねこぴ説明](/images/2022/05/nekopi-1.gif)
これは便利だにゃ!
ただし!注意点があります。
発行される INSERT 文はデータウィンドウに取得されているデータから作成されます。
つまり、データソースで選択していない項目については NULL 値となり、もし、その項目が NULL 値を許容していない場合は更新時にエラーが発生します。
このため、こちらのオプションを利用してデータウィンドウの更新を行う場合は、データソースでテーブルのすべての項目を選択することをお勧めします。
お次は「Update 文を使用」ですね(^^)/
もう察している方もおられるかな?と思いますが、
こちらに関しては、上記で説明したような「一時的にキーが重複する場合」を考慮せずに Update 文でデータを更新する、といった動作になります。
一度データを削除するのではなく、変更された値でそのまま更新するイメージですね。
これで更新特性の指定の解説に関しては終了です^^
![ちまき笑う](/images/2022/05/girl_laugh-1.png)
よく理解できました!
更新 1 つでも状況に応じて方法を変えていくのですね。
![ねこぴ問いかけ](/images/2022/05/nekopi-1.gif)
そうにゃね。
更新特性の指定はこれである程度理解できたかにゃ?
それでは、最後におさらいをしましょう。
- 結論
- Delete 文の後 Insert 文を使用・・・複数データの更新中に主キーが重複してしまう場合を考慮し、重複が起きないように対象のデータを一度削除してから追加する
- Update 文を使用・・・データを削除することなく、 Update 文でデータを更新する
いかがでしたでしょうか?
より詳しく PowerBuilder に関してお知りになりたい方は、 Appeon 社の製品サイトをチェックしてみてください。
さ・ら・に!! PowerBuilder Japan Portal の公式 YouTubeチャンネルに PowerBuilder 入門ブログを動画アニメーションにして、アップロードしております!
短い動画でより分かりやすく、そしてかわいく (?) 解説しておりますので、ぜひご覧ください!
「難しい言葉は簡単に、分かりやすく」をモットーに、今後も PowerBuilder についてお伝えしていきたいと思いますのでよろしくお願いします!