TOPサーバ構築・運用> PostgreSQLのビューの更新
徹底比較!! PostgreSQL vs MySQLパート2
徹底比較!! PostgreSQL vs MySQLパート2

第8回:それぞれが持つビュー機能
著者:NTTデータ   藤塚 勤也   2007/9/27
前のページ  1  2  3  次のページ
PostgreSQLのビューの更新

   PostgreSQLのTESTV01ビューは、このままでは更新できません。TESTV01ビューに対してUPDATE文を実行すると、以下のようなエラーが出力されます。
psql> update testv01 set col02 = 10;
ERROR:  cannot update a view
HINT:  You need an unconditional ON UPDATE DO INSTEAD rule.

   そこで、TESTV01ビューを更新可能にするために、例えば以下のようなルール「update_rule」を作成します(リスト3)。

リスト3:update_ruleと実行結果
psql> create rule update_rule
as on update
to testv01 do instead
update sample set col01 = new.col01 , col02 = new.col02
where col01 = old.col01;
psql> update testv01 set col02 = 10 ;
psql> select * from testv01;
 col01 | col02
-------+-------
 A     |    10
 A     |    10
psql> select * from sample;
 col01 | col02
-------+-------
 B     |    100
 C     |   100
 B     |   200
 A     |    10
 A     |    10

   このルールは、TESTV01ビューに対してUPDATE文が実行された際に、TESTV01ビューの基になっているSAMPLEテーブルに対してそのUPDATE文を実行するようにSQL文を置き換えるものです。

   このルールを適用すると、上記で異常終了したUPDATE文は正常に終了します。TESTV01ビューに対して実行したUPDATE文は、実際はTESTV01ビューの基になったテーブルであるSAMPLEテーブルに対して実行されたことが理解できたと思います。

   なお、UPDATE文と同様にTESTV01ビューに対し、INSERT文やDELETE文を実行できるようにするためには、それぞれのルールを作成する必要があります。


MySQLのビューの更新

   MySQLのTESTV01ビューは、何か特別な手続きや設定をすることなく、このままでも更新することができます。UPDATE文の実行結果は以下の通りです(リスト4)。

リスト4:MySQLでの実行結果
mysql> update testv01 set col02 = 10 ;
mysql> select * from testv01;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A     |    10 |
| A     |    10 |
+-------+-------+
mysql> select * from sample;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A     |    10 |
| B     |   100 |
| A     |    10 |
| C     |   100 |
| B     |   200 |
+-------+-------+

   前述したPostgreSQLのビューへのUPDATE文の実行結果と見比べてください。MySQLの場合は、PostgreSQLのルールのような特別な設定をすることなく、TESTV01ビュー、SAMPLEテーブルともに同じ結果になります。

   さらにTESTV01ビューに対して1レコードをINSERTしてみます。INSERTするレコードの値はCOL01=E、COL02=100とした場合、正常に実行することができます。しかし、TESTV01ビューをSELECTしても、INSERTしたレコードは抽出できません(リスト5)。

リスト5:INSERTを実行した結果
mysql> insert into testv01 values ('E',100);
mysql> select * from testv01;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A     |    10 |
| A     |    10 |
+-------+-------+
mysql> select * from sample;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A     |    10 |
| B     |   100 |
| A     |    10 |
| C     |   100 |
| B     |   200 |
| E     |   100 |
+-------+-------+

   実際に、TESTV01ビューの基になっているSAMPLEテーブルをSELECTすると、INSERTしたレコードが格納されていることが確認できます。ちょっと不思議な感じがしますが、これは正しい動作です。

前のページ  1  2  3  次のページ


NTTデータ  藤塚 勤也
著者プロフィール
株式会社NTTデータ   藤塚 勤也
基盤システム事業本部 オープンソース開発センタ シニアスペシャリスト。
日本タンデムコンピューターズ(現日本HP)を経て、2003年よりNTTデータにてOSS分野に参画。日頃はオリジナルOSSの開発や、OSSを用いたシステム構築への技術支援に従事。「RDBMS解剖学」(翔泳社)を共著。

INDEX
第8回:それぞれが持つビュー機能
  ビューとはなにか
PostgreSQLのビューの更新
  更新できるビューの条件