MySQLのビューはそのままで更新可能なことを説明しましたが、更新可能なためには条件があります。それは、作成したビューのレコードとその基になるテーブルのレコードが1対1に対応していることです。
では、具体的な例で確認してみましょう。
先ほど作成したTESTV01ビューとは異なる「TESTV02ビュー」を作ってみます。TESTV02ビューはSAMPLEテーブルをCOL01の値でCOL02の値を集計したものです。CREATE VIEW文は以下の通りです(リスト6)。なお、SAMPLEテーブルの値は前述の表1に示す初期状態とします。
リスト6:TESTV02ビューの作成
mysql> create view testv02
as select col01,sum(col02) as col02 from sample
where col01=’A’ group by col01;
mysql> select * from testv02;
+-------+-------+
| col01 | col02 |
+-------+-------+
| A | 300 |
+-------+-------+
では、このビューは更新できるでしょうか。UPDATE文の実行結果は以下の通りです(リスト7)。
リスト7:TESTV02ビューの実行結果
mysql> update testv02 set col02 = 10 ;
ERROR 1288 (HY000):
The target table testv02 of the UPDATE is not updatable
仮にTESTV02ビューが実テーブルであるならば、このUPDATE文の実行結果は「(COL01、COL02)=(’A’、300)」というレコードが「(’A’、10)」に更新されることが期待されます。
しかしTESTV02はビューであるため「(’A’、300)」というレコードの実体は、SAMPLEテーブルの「(’A’、100)」と「(’A’、200)」の2つのレコードを集計したものです。よって、実体となるSAMPLEテーブルのレコードを更新することができません。
更新できないというより「どのように更新したらよいのかわからない」といった方が良いかもしれません。このケースでは、TESTV02ビューのレコードとSAMPLEテーブルのレコードとが1対1には対応していないため、結果としてTESTV02ビューの更新ができないという例となります。
|