Persistierung abgeleiteter Tabellen mit SQL (MySQL )
Vorbereitung
Zum Nachvollziehen der folgenden Beispiele kann das folgende Skript in einen MySQL -Klienten kopiert werden. Der Inhalt dieses Skripts kann aber ansonsten ignoriert werden. Beim Kopieren ist darauf zu achten, nur genau den Text von »DROP« bis zum letzten »;« zu kopieren und dann die Eingabetaste zu drücken.
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE PAAR ( LINKS VARCHAR ( 255 ), RECHTS VARCHAR ( 255 ));
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'D', 'D' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'D', 'E' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'E', 'D' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'E', 'E' );
SELECT * FROM PAAR;
Einfügen eines Abfrageergebnisses
Das Ergebnis einer SELECT-Abfrage, also eine abgeleitete Tabelle, kann auch in eine Basistabelle eingefügt werden, indem die SELECT-Abfrage in einer INSERT-Anweisung an Stelle einer VALUES-Klausel verwendet wird.
- Konsole (MySQL, T92, C99, C03)
CREATE TABLE ERGEBNIS ( BUCHSTABE VARCHAR ( 255 ));
- Konsole (MySQL, E92, C99, C03)
INSERT INTO ERGEBNIS ( BUCHSTABE ) SELECT DISTINCT LINKS FROM PAAR;
Records: 2 Duplicates: 0 Warnings: 0
SELECT * FROM ERGEBNIS;
+-----------+
| BUCHSTABE |
+-----------+
| D |
| E |
+-----------+- Aussprachehinweis
- duplicate (n) ˈduːplɪkət
Wir sprechen hier von Persistierung, weil dadurch flüchtige Informationen persistent (dauerhaft) gemacht werden.
Die Spalten des Ergebnisses der SELECT-Abfrage werden nacheinander den Spalten der Zieltabelle zugeordnet, deren Namen in den runden Klammern angegeben sind.
Es besteht aber das Risiko, daß bei der Verwendung dieses Vorgehensweise Redundanz in die Datenbank eingefügt wird. Deswegen sollten zum Speichern von Abfrage Ansichten (Views) bevorzugt werden. Eine Ansicht ergibt allerdings bei Verwendung stets das Ergebnis einer aktuellen Abfrage während in einer Basistabelle ein Ergebnis einer früheren Abfrage gespeichert werden kann.
Diese INSERT-SELECT-Kombination erlaubt es auch, bei Bedarf genaue oder veränderte Kopien von Basistabellen anzulegen. Sie kann beispielsweise verwendet werden, um bei der manuellen Überarbeitung von Tabellen vorübergehende Sicherungskopien anzulegen.
MySQL
Unter MySQL kann eine Tabelle auch wie folgt angelegt und gleichzeitig kopiert werden, dies ist aber kein Standard-SQL .
- Konsole (MySQL )
CREATE TABLE P AS SELECT * FROM PAAR;
Die Syntax erinnert dabei an das schon behandelte Anlegen einer Ansicht.
- Konsole (MySQL )
CREATE VIEW P AS SELECT * FROM ZAHL;
Das »AS« kann dabei auch weggelassen werden.
- Konsole (MySQL )
CREATE TABLE P SELECT * FROM PAAR;
Übungsaufgaben
/ Kopieren einer Tabelle *
- Skript (MySQL )
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE PAAR ( LINKS VARCHAR ( 255 ), RECHTS VARCHAR ( 255 ));
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'D', 'D' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'D', 'E' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'E', 'D' );
INSERT INTO PAAR ( LINKS, RECHTS ) VALUES ( 'E', 'E' );
SELECT * FROM PAAR;
Legen Sie eine neue Tabelle »DL« mit den beiden Spalten »RECHTS« und »LINKS« (in dieser Reihenfolge) an und kopieren Sie dann die vorhandene Tabelle »Paar« in die neue Tabelle »DL«. Dabei soll die Reihenfolge der Spalten vertauscht werden, aber jede Spalte der neuen Tabelle »DL« soll dieselben Werte enthalten wie die gleichnamige Spalte der Originaltabelle »PAAR«.