Frage

Wenn ich eine Ansicht, die ich im Grunde bin eine neue Tabelle zu machen, die automatisch auf, wenn Daten in eine der Tabellen abgewickelt wird es Änderungen verbindet; ist das richtig?

Auch warum kann ich nicht verwenden Unterabfragen in meinen Augen?

War es hilfreich?

Lösung

Ein Blick Werk wie eine Tabelle , aber es ist kein Tisch. Es existiert nicht; es ist nur eine vorbereitete SQL-Anweisung, die ausgeführt wird, wenn Sie den Namen der Ansicht verweisen. IE:

CREATE VIEW foo AS
  SELECT * FROM bar

SELECT * FROM foo

... ist äquivalent zu laufen:

SELECT x.* 
  FROM (SELECT * FROM bar) x

Ein MySQLDump nie Zeilen enthalten in eine Ansicht eingefügt werden ...

Auch warum kann ich nicht Subqueries meiner Meinung nach verwenden ????

Das, leider ist durch (wenn auch fragwürdige) Design. Es gibt zahlreiche Einschränkungen für MySQL Ansichten, die dokumentiert sind: http: // dev.mysql.com/doc/refman/5.0/en/create-view.html

Also wenn es nur eine imaginäre Tabelle / vorbereitete Erklärung heißt das es theoretisch die gleiche Leistung hat (oder sogar weniger) als eine normale Tabelle / Abfrage?


Nein.
Eine Tabelle kann Indizes zugeordnet, die Daten schneller Retrieval machen können (etwas auf Kosten für insert / update). Einige Datenbanken unterstützen „materialisiert“ Ansichten, die Ansichten sind, die Indizes angewendet zu ihnen haben kann - das ist keine Überraschung sein sollte, dass MySQL nicht unterstützt die eingeschränkte Sicht Funktionalität (gegeben, die v5 begann erst in IIRC, sehr spät, um das Spiel).

Da eine Ansicht, eine abgeleitete Tabelle ist, ist die Leistung der Ansicht nur so gut wie die Abfrage wird gebaut auf. Wenn diese Abfrage saugt, wird das Leistungsproblem nur Schneeball ... sagte, dass, wenn eine Ansicht Abfrage - wenn eine Ansicht Spaltenverweis in der WHERE-Klausel nicht in einer Funktion eingewickelt (IE: WHERE v.column LIKE ..., nicht WHERE LOWER(t.column) LIKE ...), der Optimierer möglicherweise die Kriterien schieben (Prädikat) auf die ursprüngliche Abfrage genannt - so dass es schneller

.

Andere Tipps

Ich lief in das gleiche Problem auch (zu meiner Überraschung, weil meine Suche, um anzuzeigen scheint, dass Oracle und MS es unterstützen).

ich diese Einschränkung zu umgehen (zumindest für jetzt, bis zum Beweis nicht nutzbar), indem zwei zusätzliche Ansichten für meine letzte Aussicht.

Beispiel:

CREATE VIEW Foo1 AS
    SELECT * FROM t ORDER BY ID, InsertDate DESC

CREATE VIEW Foo2 AS
    SELECT * FROM Foo1 GROUP BY ID

CREATE VIEW Foo AS
    SELECT * FROM Foo2 ORDER BY ID

Das obige Beispiel hat im Grunde eine Tabelle ‚t‘, die eine zeitliche Tabelle ist es, alle Änderungen enthält. Meine ‚Foo‘ (Ansicht) ist im Grunde eine einfache Ansicht nur meine aktuellsten Versionen jeden Datensatz. Scheint zu funktionieren gut für dich jetzt!

Update:

Ich weiß nicht, ob dies ein weiterer Fehler in MySQL ist 5.1, aber das obige Beispiel in der Tat nicht die Arbeit! Der ‚Foo1‘ funktioniert wie erwartet, aber die ‚foo2‘ scheint die Reihenfolge vor der Gruppierung so mein Endergebnis zu ignorieren ist nicht das, was beabsichtigt ist. Ich bekomme auch das gleiche Ergebnis, wenn ich den ‚DESC‘ für ‚ASC‘ ändern (überraschend).

Auch wenn Sie die lesen 17.5.1. Ansicht Syntax , es eindeutig fest:

„Eine Ansicht kann aus vielen Arten von SELECT-Anweisungen erstellt werden. Es auf Basistabellen oder andere Ansichten beziehen kann. Es kann Gebrauch verbindet, UNION und Unterabfragen.“

Ich werde meine Datenbank 5.6 und versuchen Sie es erneut aktualisieren!

Der Unterschied ist:

Zur Ansicht können Sie nur Unterabfragen haben in dem where - teilweise nicht in dem von - Teil so ein

CREATE VIEW v AS SELECT * FROM foo WHERE id IN (SELECT id FROM bar) 

funktionieren würde - aber zur gleichen Zeit, die Sie eine schreibgeschützte Ansicht bekommen ... Eine einfache Ansicht auf einer einzige Tabelle zu aktualisieren erlauben würde, „durch“ die im Hinblick auf die zu Grunde liegenden Tabelle

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top