株式会社わくわくスタディワールド

株式会社わくわくスタディワールド

更新可能なビューとは

本日,わく☆すた公開セミナー「応用情報技術者午後対策 3回コース」の1回目が無事終了しました。
ご参加いただいた皆様,ありがとうございました。弊社facebookページで写真を公開しています。

今日は,基礎理論(プログラミング),システム開発,データベースの,システム開発に関する主要3分野についての講義を行いました。
その講義の中で,ビューの更新のついての質問があり,また,よく聞かれることでもありますので,ここにまとめておきます。

ビューというのは,見せるための表で,元の表から必要なデータを選択し,表示します。ビュー表自体は実際には存在せず,ビュー表が更新された場合には,更新される表は元の表になります。

ですので,ビューが更新できる場合には,元の表がちゃんと特定できて,更新できる必要があります。
そのため,集計関数やDISTINCT,GROUP BY句などで複数の行を1つにまとめた場合などは,元の表の特定ができないので更新できません。

また,昔は複数の表を結合した場合にも更新が不可になっていたのですが,最近のSQLでは,複数の表を結合していても,行が特定できれば更新可能な場合もあります。

正確には,情報処理技術者試験は,「試験で使用する情報処理用語・プログラム言語など」の記述にあるSQLの規格,JIS X 3005 に載っていますので,こちらを参照されるのが一番確実です。

JIS X 3005に載っているビューの定義は,基礎理論でよく出てくるBNF表記で書かれていて,次のようになっています。


  ::=
   CREATE [ RECURSIVE ] VIEW
     AS [ WITH [ ] CHECK OPTION ]

そして,更新可能かどうかについては,次のような記述があります。


  • が更新可能ならば,ビュー表は,更新可能とする。

  • が単純に更新可能ならば,ビュー表は,単純に更新可能とする。

  • ビュー表が単純に更新可能か,又はSQL処理系が機能“更新可能な結合,和集合及び列”を提供し,かつ,ビュー表が更新可能ならば,ビュー表は,実効的に更新可能とする。

細かい言葉の定義はこのほかにもいろいろあるのですが,ビュー表は,問合せの式(普通はSELECT文)がビュー表と実表を1対1に対応付けられるもの場合以外は,基本的に更新不可です。

複数の表にまたがるビューが更新可能がどうかは,JIS規格のとおり,「SQL処理系が機能“更新可能な結合,和集合及び列”を提供」しているかどうかにかかっています。
ちなみに,OracleやMySQLなどは,この機能を提供していますので,複数の表のビューでも更新可能なことがあります。


現時点での更新可能なビューについての定義は,以上です。
ビューの更新については,いろいろ変化している部分でもありますので,今後も変わってくるかもしれません。

ただ,昔ながらの参考書にありがちな,「複数の表にまたがるビューは更新不可」は,単純に言えなくなっています。
これを丸暗記してしまっている方は注意してください。

去年の応用情報技術者試験(平成24年春午後問6設問3)に,ビューが更新不可能な理由として,「複数の表からビューを作成しているから」という誤答の選択肢があります。

これは,結構多くの人がひっかかったようですし,よく「参考書にそう書いてあるのですがなんで違うのですが?」と質問されるのですが,それは参考書の内容が古いだけです。

ちなみに正解は,「集約関数を用いているから」です。集約関数を用いて行をまとめると,ビュー表と実表を1対1に対応付けできなくなりますので更新不可です。


ということで,長々と書いてしまいましたが,ITの分野は進歩が速いので,ある時点で正しかった内容も古くなることはよくあります。
できるかぎり新しい情報にもアンテナをはって,知識をリフレッシュさせていきましょう。