|
||||||||||||||||||
| 前のページ 1 2 3 次のページ | ||||||||||||||||||
| PostgreSQLのビューの更新 | ||||||||||||||||||
|
PostgreSQLのTESTV01ビューは、このままでは更新できません。TESTV01ビューに対してUPDATE文を実行すると、以下のようなエラーが出力されます。
psql> update testv01 set col02 = 10;
そこで、TESTV01ビューを更新可能にするために、例えば以下のようなルール「update_rule」を作成します(リスト3)。 リスト3:update_ruleと実行結果
psql> create rule update_rule
このルールは、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 ;
前述した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);
実際に、TESTV01ビューの基になっているSAMPLEテーブルをSELECTすると、INSERTしたレコードが格納されていることが確認できます。ちょっと不思議な感じがしますが、これは正しい動作です。 |
||||||||||||||||||
|
前のページ 1 2 3 次のページ |
||||||||||||||||||
|
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||
|
|
||||||||||||||||||
|
||||||||||||||||||

