Die View-Verarbeitung ist nicht optimiert:
Es ist nicht möglich, auf einer View einen Index anzulegen.
Indizes können für Views eingesetzt werden, die mit dem Merge-Algorithmus verarbeitet werden. Wird jedoch eine View mit dem Temptable-Algorithmus verarbeitet, kann sie nicht von den Indizes ihrer zugrunde liegenden Tabellen profitieren (obwohl Indizes bei der Erzeugung der temporären Tabellen eingesetzt werden können).
Unterabfragen dürfen nicht in der FROM
-Klausel
einer View verwendet werden. Diese Beschränkung wird jedoch in
Zukunft aufgehoben.
Generell können Sie nicht in derselben Unterabfrage eine Tabelle modifizieren und gleichzeitig mit Select abfragen. Siehe Abschnitt I.3, „Beschränkungen von Unterabfragen“.
Dasselbe Prinzip gilt auch, wenn Sie eine View abfragen, die ihrerseits eine Tabelle abfragt, wenn die View die Tabelle in einer Unterabfrage abfragt und mit dem Merge-Algorithmus ausgewertet wird. Beispiel:
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;
Wird die View mit einer temporären Tabelle ausgewertet,
können Sie diese Tabelle in der
View-Unterabfrage abfragen und in der äußeren Abfrage dennoch
die Tabelle modifizieren. In diesem Fall wird die View nämlich
materialisiert, sodass Sie die Tabelle in Wirklichkeit gar nicht
„zur selben Zeit“ in einer Unterabfrage abfragen und
modifizieren. (Dies ist ein weiterer Grund, MySQL zur Verwendung
des Temptable-Algorithmus zu zwingen, indem Sie ALGORITHM
= TEMPTABLE
in der View-Definition angeben.)
Mit DROP TABLE
oder ALTER
TABLE
können Sie eine Tabelle löschen oder ändern,
die in einer View-Definition benutzt wird (wodurch die View
ungültig wird). Die Löschungs- oder Änderungsoperation löst
keine Warnung aus. Erst später, wenn die View benutzt wird, wird
ein Fehler gemeldet.
Eine View-Definition wird von bestimmten Anweisungen „eingefroren“:
Wenn eine von PREPARE
vorbereitete
Anweisung auf eine View verweist, spiegeln die Inhalte der
View jedes Mal, wenn die Anweisung im weiteren Verlauf
ausgeführt wird, den Zustand zu dem Zeitpunkt wider, da sie
vorbereitet wurde. Das gilt auch dann, wenn die
View-Definition zwischen der Vorbereitung und der Ausführung
der Anweisung geändert wurde. Beispiel:
CREATE VIEW v AS SELECT 1; PREPARE s FROM 'SELECT * FROM v'; ALTER VIEW v AS SELECT 2; EXECUTE s;
Die EXECUTE
-Anweisung gibt 1 und nicht 2
zurück.
Wenn eine Anweisung in einer gespeicherten Routine eine View benutzt, dann mit dem Inhalt, den die View bei der ersten Ausführung der Anweisung hatte. Das bedeutet beispielsweise: Wenn die Anweisung in einer Schleife ausgeführt wird, bekommt sie in allen weiteren Durchläufen immer denselben View-Inhalt zu sehen, selbst wenn die View-Definition später in der Schleife geändert wird. Beispiel:
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();
Wenn die Prozedur p()
aufgerufen wird, gibt
SELECT
bei jedem Schleifendurchlauf 1
zurück, obwohl die View-Definition in der Schleife geändert
wurde.
Im Hinblick auf die Aktualisierungsmöglichkeit besteht für Views
das übergeordnete Ziel, dass jede View, die theoretisch
aktualisiert werden kann, auch in der Praxis aktualisierbar sein
sollte. Dazu gehören auch Views, die in ihrer Definition eine
UNION
haben. Zurzeit sind nicht alle
theoretisch aktualisierbaren Views auch in der Praxis
aktualisierbar. Die ursprüngliche Implementierung von Views war
absichtlich so geschrieben worden, um möglichst schnell
benutzbare und aktualisierbare Views in MySQL hinzuzubekommen.
Viele theoretisch aktualisierbare Views sind dies auch in der
Praxis, aber es gibt immer noch einige Einschränkungen:
Aktualisierbare Views, die irgendwo anders als in der
WHERE
-Klausel Unterabfragen haben. Manche
Views mit Unterabfragen in der SELECT
-Liste
sind möglicherweise aktualisierbar.
Sie können mit UPDATE
nicht mehr als eine
unterliegende Tabelle einer als Join definierten View
aktualisieren.
Sie können eine als Join definierte View nicht mit
DELETE
aktualisieren.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.