幾つかのビューは更新可能です。すなわち、基礎をなすテーブルの内容を更新するため、
UPDATE、DELETEもしくはINSERTのようなステートメントの中でそれらを使うことができます。
ビューを更新可能にするため、ビュー中の行と基礎テーブル中の行の間に1対1の関係が存在
しなければなりません。ビューを更新不能にするその他の生成子もあります。
もっと具体的に言うと、それが以下のいずれかを含んでいるとビューは更新可能となりません。

* 集約ファンクション(SUM()、 MIN()、 MAX()、COUNT()等)
* DISTINCT
* GROUP BY
* HAVING
* UNION もしくはUNION ALL
* 選択リスト中のサブ・クエリ
* 特定結合(このセクション中の後の部分に追加した結合の説明参照)
* FROM節中の更新不能ビュー
* FROM節中のテーブルを参照するWHERE 節中のサブ・クエリ
* 文字値だけを参照(この場合、更新する基礎となるテーブルは存在しません)
* ALGORITHM = TEMPTABLE (テンポラリテーブルの使用は常にビューを更新不能にする)

① [更新不可能 ] Use of ALGORITHM=TEMPTABLE in the view definition

TEMPTABLEの場合、ビューの結果がテンポラリーテーブルの中に復元され、
その後、ステートメントを実行するために使用されます。
よってUPDATE文は、TEMPTABLEに影響するがベーステーブルには影響しない。

② [更新可能 ]  Use of ALGORITHM=MERGE in the view definition

UNDEFINEDの場合、MySQLは使用すべきアルゴリズムを選択します。
それは出来るだけTEMPTABLEよりMERGEを優先します。これは、MERGEは通常より効率的で、
ビューはテンポラリテーブルを使用すると更新可能ではなくなるためです。

明確にTEMPTABLEを選択する理由は、テンポラリテーブルを選んだ後ステートメントの
処理終了に使用する前に、内在するテーブルのロックを解放することができるからです。
その結果、ロックをMERGEアルゴリズムよりも速やかに解除し、ビューを使う他のクライアント
が長時間ブロックされないようにします。

————————–
補足
————————–
以下に示す3つの理由によって、ビューアルゴリズムをUNDEFINEDにすることができます。
* CREATE VIEWステートメントの中にALGORITHM節が現れない。
* CREATE VIEWステートメントにALGORITHM = UNDEFINED節が明確に含まれている。
* テンポラリテーブルだけを使って処理できるビューに対して、ALGORITHM = MERGEが規定される。
この場合、MySQL は警告を発し、アルゴリズムをUNDEFINEDにセットします。

③  [更新不可能 ] Use of aggregate functions in the view definition

④ [更新不可能 ] Use of GROUP BY or HAVING clauses in the view definition

⑤ [更新可能 ] Use of expressions like col = col + 1 in the view definition


mysql> UPDATE V_CountryPopCalc SET PopNew = 1000
-> WHERE Name = 'United States';
ERROR 1348 (HY000): Column 'PopNew' is not updatable


mysql> UPDATE V_CountryPopCalc SET Name = 'Update Test for V_CountryPopCalc'
-> WHERE Name = 'United States';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

update

参考サイト

20.2. CREATE VIEW 構文