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.

