ビューの処理は最適化されていません :
ビューにインデックスを作成することはできません。
組合せアルゴリズムを使用して処理されたビューに、インデックスを使うことは可能です。しかし、誘導可能なアルゴリズムで処理されたビューは、その背後にあるテーブルのインデックスを活用することができません ( 一時テーブルの作成中にインデックスを使用することはできます ) 。
ビューの FROM
句でサブクエリを使用することはできません。この制限はいずれ取り除かれる予定です。
一般原則として、テーブルを改変したり、サブクエリの同じテーブルから選択することはできません。項D.3. 「サブクエリの規制」 参照。
また、テーブルから選択するビューを選ぶ場合、ビューがサブクエリのテーブルから選択する場合、そして、ビューが組合せアルゴリズムを使って評価される場合、同じ原則が適用されます。例 :
CREATE VIEW v1 AS SELECT * FROM t2 WHERE EXISTS (SELECT 1 FROM t1 WHERE t1.a = t2.a); UPDATE t1, v2 SET t1.a = 1 WHERE t1.b = v2.b;
一時テーブルを使ってビューが評価される場合、ビュー
サブクエリのテーブルから選択し、さらに外側のクエリのテーブルで改変することが
可能
です。その場合、ビューは一時テーブルに格納されることになり、したがってサブクエリのテーブルから選択し、「同時に」
改変するということにはなりません。(これもまた、ビュー定義で
ALGORITHM = TEMPTABLE
を指定して、誘導可能なアルゴリズムをMySQL
が使用するよう強制できると便利だと考える理由です)。
DROP TABLE
または ALTER
TABLE
を使用して、ビュー定義 (
ビューを無効化するもの )
や削除または変更オペレーションからの無警告結果に使われるテーブルを、削除または変更することができます。エラーは、後でビューが使用された時に発生します。
ビュー定義は特定のステートメントによって「凍結」されています :
PREPARE
によって準備されたステートメントがビューを参照する場合、後でステートメントが実行される度に参照されるビューの内容が、ステートメントが準備できた時のビューの内容になります。これは、ステートメントが準備された後、実行される前にビュー定義が変更されても同じことです。例
:
CREATE VIEW v AS SELECT 1; PREPARE s FROM 'SELECT * FROM v'; ALTER VIEW v AS SELECT 2; EXECUTE s;
EXECUTE
ステートメントによって返される結果は 2
ではなく、1 です。
ストアド ルーチンのステートメントがビューを参照する場合、ステートメントによって参照されたビューの内容は、最初にステートメントが実行された時のその内容です。これは例えば、ステートメントがループで実行された場合、さらなるステートメントの繰り返しが、後でビュー定義がループで変更されたとしても、同じビューの内容を参照するという意味になります。例 :
CREATE VIEW v AS SELECT 1; delimiter // CREATE PROCEDURE p () BEGIN DECLARE i INT DEFAULT 0; WHILE i < 5 DO SELECT * FROM v; SET i = i + 1; ALTER VIEW v AS SELECT 2; END WHILE; END; // delimiter ; CALL p();
プロシージャ p()
が呼び出される際、SELECT
は、たとえビュー定義がループ内で変更されても、ループを通るたびに
1 を戻します。
ビューの更新可能性に関しては、すべてのビューが理論的には更新可能ならば、実際に更新可能であるべきだというのがビューに対する全体的な目標です。これには、定義に
UNION
を含むビューも含まれています。現時点では、理論的には更新可能なすべてのビューが、実際に更新可能というわけではありません。最初のビュー実装は、できるだけ速く
MySQL
に使用可能で更新可能なビューを提供するため、故意にこのように書かれていました。理論的には更新可能なビューの多くは、今でも更新することができますが、制限はまだ存在します
:
WHERE
句以外にある、サブクエリを持った更新可能なビュー。SELECT
リストにある、サブクエリを持つビューのいくつかは、更新可能な場合がある。
UPDATE
を使用して、結合として定義されたビューの背後のテーブルをひとつ以上更新することはできない。
DELETE
を使用して、結合として定義されたビューを更新することはできない。
ビューの現在の実装には欠点があります。もしユーザがビューの作成に必要な基本権限
( CREATE VIEW
と SELECT
権限 ) を取得した場合、SHOW VIEW
権限も取得しない限り、そのユーザはオブジェクトの
SHOW CREATE VIEW
を呼び出すことはできないでしょう。
この欠点は、mysqldump を持つデータベースのバックアップの問題につながり、権限の不足のため失敗する原因になる恐れがあります。この問題は バグ #22062 で説明されています。
問題に対する迂回策としては、ビューが作成された時に
MySQL が暗黙的にSHOW VIEW
権限を与えないので、管理権限者が手動でその権限を、CREATE
VIEW
を与えられたユーザに提供することです。