|
||||||||||||||||||
| 前のページ 1 2 3 | ||||||||||||||||||
| 更新できるビューの条件 | ||||||||||||||||||
|
MySQLのビューはそのままで更新可能なことを説明しましたが、更新可能なためには条件があります。それは、作成したビューのレコードとその基になるテーブルのレコードが1対1に対応していることです。 では、具体的な例で確認してみましょう。 先ほど作成したTESTV01ビューとは異なる「TESTV02ビュー」を作ってみます。TESTV02ビューはSAMPLEテーブルをCOL01の値でCOL02の値を集計したものです。CREATE VIEW文は以下の通りです(リスト6)。なお、SAMPLEテーブルの値は前述の表1に示す初期状態とします。 リスト6:TESTV02ビューの作成
mysql> create view testv02
では、このビューは更新できるでしょうか。UPDATE文の実行結果は以下の通りです(リスト7)。 リスト7:TESTV02ビューの実行結果
mysql> update testv02 set col02 = 10 ;
仮にTESTV02ビューが実テーブルであるならば、このUPDATE文の実行結果は「(COL01、COL02)=(’A’、300)」というレコードが「(’A’、10)」に更新されることが期待されます。 しかしTESTV02はビューであるため「(’A’、300)」というレコードの実体は、SAMPLEテーブルの「(’A’、100)」と「(’A’、200)」の2つのレコードを集計したものです。よって、実体となるSAMPLEテーブルのレコードを更新することができません。 更新できないというより「どのように更新したらよいのかわからない」といった方が良いかもしれません。このケースでは、TESTV02ビューのレコードとSAMPLEテーブルのレコードとが1対1には対応していないため、結果としてTESTV02ビューの更新ができないという例となります。 |
||||||||||||||||||
| PostgreSQLのビューだとどうなるのか | ||||||||||||||||||
|
上記のように、MySQLでは基になるテーブルのレコードと1対1に対応していないビューは更新できないことを具体的に示しました。 それでは、PostgreSQLのビューの場合はどうなのでしょうか。PostgreSQLのビューはルールの設定がなければ更新できませんが、逆にルールを設定すれば、どのようなビューでも更新できてしまいます。 例えば、前述したTESTV01ビューの更新用に使用したルール「update_rule」を名称のみ「update_rule2」に変更し、同一内容のものをTESTV02ビューに適用してみます(リスト8)。 リスト8:PostgresSQLのビューの場合
psql> create view testv02
上記の通り、TESTV02ビューへのUPDATE文は実行可能になります。しかし、その結果は期待するものではありません。要するに「更新処理が実行できること」と「更新処理が期待する結果になること」は、まったくの別物なのです。 やはりPostgreSQLのビューであっても、MySQLのビューの更新処理制限と同様に「レコードが1対1に対応していないビューは更新不可とする」ためにルールの提供を行わないことこそが、正しい設計だと考えます。 |
||||||||||||||||||
|
前のページ 1 2 3 |
||||||||||||||||||
|
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||

