いくかのビュは更新可能です。つまり,これらのビューを更新
、删除
、插入
などのステトメントで使用して,ベブルの内容を更新できます。ビューが更新可能であるためには,そのビュー内の行とベースとなるテーブル内の行の間に対1の関係が存在する必要があります。また,ビュを更新不可能にするその他の特定の構造構文も存在します。より具体的には,次のいずれかを含む場合,ビュ,は更新可能ではありません。
集計関数 (
SUM ()
、MIN ()
、MAX ()
、COUNT ()
など)截然不同的
集团
有
联盟
またはUNION ALL
選択リスト内のサブクエリ
特定の結合(このセクションで後述する結合に関する追加説明を参照してください)
从
句内の更新不可能なビュ从
句内のテブルを参照する在哪里
句内のサブクエリリテラル値だけの参照(この場合,更新するベブルがありません)
算法=易被诱惑的
の使用(一時テブルを使用すると常にビュは更新不可能になります)ベステブルのいずれかのカラムに対する複数の参照。
挿入可能性 (插入
ステートメントで更新可能であること)については,更新可能なビューがビューカラムに対する次の追加要件も満たしている場合に挿入可能になります。
重複したビュカラム名が存在しないようにする必要があります。
ビュには,デフォルト値を持たない,ベブル内のすべてのカラムが含まれている必要があります。
ビュカラムは,派生カラムではなく,単純なカラム参照である必要があります。派生カラムは,単純なカラム参照ではなく,式から派生したカラムです。派生したカラムの例は次のとおりです。
3.14159 col1 + 3 UPPER(col2) col3 / col4 (子查询)
単純なカラム参照と派生カラムが混在しているビューは挿入できませんが,派生カラム以外のカラムだけを更新する場合は,更新可能になります。次のビュを考えてみてください。
CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;
このビュは,col2
が式から派生しているので挿入できません。ただし,更新でcol2
を更新しようとしていない場合は,更新可能になります。次の更新は許可されます。
SET col1 = 0;
次の更新は,派生カラムを更新しようとしているので,許可されません。
SET col2 = 0;
合并
アルゴリズムで処理できるとすれば,複数テブルビュが更新できる可能性があります。これを実現するには,ビュ,で(外部結合または联盟
ではなく)内部結合を使用する必要があります。また,ビュ,定義内の単一のテ,ブルだけを更新できるので,集
句は,ビュ内のいずれかのテブルのカラムだけを指名する必要があります。UNION ALL
を使用するビュは,実装が一時テブルを使用して処理するので,理論的に更新可能でも許可されません。
更新可能な複数テブルビュでは,插入
は,単一のテブルに挿入する場合に機能します。删除
はサポトされません。
插入延迟
は,ビュではサポトされません。
テブルにAUTO_INCREMENT
カラムが含まれている場合,AUTO_INCREMENT
カラムが含まれていないテブル上の挿入可能なビュに挿入すると,LAST_INSERT_ID ()
の値を変更しません。これは,ビュの一部ではないカラムにデフォルト値を挿入した副作用が現れないようにするためです。
更新可能なビュに対して检查选项
句を指定すると,select_statement
内の在哪里
句がtrueである行を除く行への挿入または更新を回避できます。
更新可能なビュに対する检查选项
句では,そのビュ,が別のビュ,との関連で定義されている場合,当地的
および级联
キワドによってチェックテストのスコプが決定されます。当地的
キワドは,检查选项
を,定義されているビュのみに制限します。级联
を指定すると,ベスとなるビュに対するチェックも評価されます。どらのキワドも指定されていない場合,デフォルトは级联
になります。次のテブルと一連のビュの定義を考えてみてください。
CREATE TABLE t1 (a INT);CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 2 -> WITH CHECK OPTION;CREATE VIEW v2 AS SELECT * FROM v1 WHERE > 0 -> WITH LOCAL CHECK OPTION;CREATE VIEW v3 AS SELECT * FROM v1 WHERE > 0 -> WITH CASCADED CHECK OPTION;
ここで,v2
およびv3
ビュは,v1
という別のビュの観点で定義されています。v2
には当地的
チェックオプションがあるので,挿入は,v2
チェックに対してのみテストされます。v3
には级联
チェックオプションがあるので,挿入はそれ自身のチェックに対してだけでなく,ベースとなるビューのチェックに対してもテストされます。次のステトメントでこれらの違いを示しています。
INSERT INTO v2 VALUES (2);查询OK, 1 row affected (0.00 sec) mysql> INSERT INTO v3 VALUES (2);错误1369 (HY000): CHECK OPTION failed 'test.v3'
MySQLは,创建视图
時に,ビュの更新可能性フラグというフラグを設定します。更新
および删除
(および同様の操作)がビュで有効な場合,フラグは是的
(正确)に設定されます。それ以外の場合,フラグは没有
(错误)に設定されます。INFORMATION_SCHEMA。的观点
テブルのIS_UPDATABLE
カラムは,このフラグのステタスを表示します。これは,ビュが更新可能であるかどうかをサバが常に把握していることを意味します。ビュが更新可能ではない場合,更新
、删除
、插入
などのステートメントは無効であり,拒否されます。(このセクションの別の箇所で説明しているように,ビューが更新可能である場合でも,ビューへの挿入はできない場合もあります)。
ビュを更新できるかどうかは,updatable_views_with_limit
システム変数の値に影響されます。セクション5.1.4 "サバシステム変数"を参照してください。