MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

25.5.3 更新可能および挿入可能なビュー

一部のビューは更新可能であり、それらへの参照を使用して、データ変更ステートメントで更新するテーブルを指定できます。 つまり、これらのビューを UPDATEDELETEINSERT などのステートメントで使用して、ベースとなるテーブルの内容を更新できます。 導出テーブルおよび共通テーブル式は、複数テーブルの UPDATE ステートメントおよび DELETE ステートメントでも指定できますが、更新または削除する行を指定するためのデータの読取りにのみ使用できます。 通常、ビュー参照は更新可能である必要があります。つまり、マージされて実体化されない場合があります。 コンポジットビューには、より複雑なルールがあります。

ビューが更新可能であるためには、そのビュー内の行とベースとなるテーブル内の行の間に 1 対 1 の関係が存在する必要があります。 また、ビューを更新不可能にするその他の特定の構造構文も存在します。 より具体的には、次のいずれかを含む場合、ビューは更新可能ではありません。

ビュー内の生成されたカラムは、割り当て可能であるため、更新可能とみなされます。 ただし、このようなカラムが明示的に更新される場合、許可される値は DEFAULT のみです。 生成されるカラムの詳細は、セクション13.1.20.8「CREATE TABLE および生成されるカラム」 を参照してください。

MERGE アルゴリズムで処理できるとすれば、複数テーブルビューが更新できる可能性があります。 これを実現するには、ビューで (外部結合または UNION ではなく) 内部結合を使用する必要があります。 また、ビュー定義内の単一のテーブルだけを更新できるので、SET 句は、ビュー内のいずれかのテーブルのカラムだけを指名する必要があります。 理論的には更新可能であっても、UNION ALL を使用するビューは許可されません。

挿入可能性 (INSERT ステートメントで更新可能であること) については、更新可能なビューがビューカラムに対する次の追加要件も満たしている場合に挿入可能になります。

MySQL は、CREATE VIEW 時に、ビューの更新可能性フラグというフラグを設定します。 UPDATE および DELETE (および同様の操作) がビューで有効な場合、フラグは YES (true) に設定されます。 それ以外の場合、フラグは NO (false) に設定されます。 INFORMATION_SCHEMA.VIEWS テーブルの IS_UPDATABLE カラムは、このフラグのステータスを表示します。 これは、ビューが更新可能であるかどうかをサーバーが常に把握していることを意味します。

ビューが更新可能でない場合、UPDATEDELETE および INSERT などのステートメントは無効であり、拒否されます。 (ビューが更新可能であっても、このセクションの別の場所で説明されているように、ビューに挿入できない場合があります。)

ビューを更新できるかどうかは、updatable_views_with_limit システム変数の値に影響されます。 セクション5.1.8「サーバーシステム変数」を参照してください。

次の説明では、これらのテーブルおよびビューが存在するとします:

CREATE TABLE t1 (x INTEGER);
CREATE TABLE t2 (c INTEGER);
CREATE VIEW vmat AS SELECT SUM(x) AS s FROM t1;
CREATE VIEW vup AS SELECT * FROM t2;
CREATE VIEW vjoin AS SELECT * FROM vmat JOIN vup ON vmat.s=vup.c;

INSERTUPDATE および DELETE ステートメントは、次のように許可されます:

その他の説明と例を次に示します。

このセクションの以前の説明では、すべてのカラムが単純なカラム参照ではない場合 (たとえば、式または複合式であるカラムが含まれている場合)、ビューを挿入できないことを指摘していました。 このようなビューは挿入できませんが、式ではないカラムのみを更新すると更新できます。 次のビューを考えてみてください。

CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;

col2 が式であるため、このビューは挿入できません。 ただし、更新で col2 を更新しようとしていない場合は、更新可能になります。 次の更新は許可されます。

UPDATE v SET col1 = 0;

式カラムを更新しようとしているため、この更新は許可されません:

UPDATE v SET col2 = 0;

テーブルに AUTO_INCREMENT カラムが含まれている場合、AUTO_INCREMENT カラムが含まれていないテーブル上の挿入可能なビューに挿入すると、LAST_INSERT_ID() の値を変更しません。これは、ビューの一部ではないカラムにデフォルト値を挿入した副作用が現れないようにするためです。