MySQL :: MySQL 8.0 Referenzhandbuch :: 13.2.10.1 SELECT … INTO-Anweisung

13.2.10.1 SELECT .. INTO-Anweisung

Die SELECT ... INTO -Form von SELECT wird aktiviert Ein Abfrageergebnis, das in Variablen gespeichert oder in eine Datei geschrieben werden soll:

  • SELECT ... INTO var_list wählt Spaltenwerte aus und speichert sie in Variablen.

  • SELECT ... INTO OUTFILE schreibt die ausgewählten Zeilen in eine Datei. Spalten- und Zeilenabschlüsse können angegeben werden, um ein bestimmtes Ausgabeformat zu erzeugen.

  • SELECT ... INTO DUMPFILE schreibt eine einzelne Zeile ohne Formatierung in eine Datei.

Eine gegebene SELECT -Anweisung kann höchstens eine INTO -Klausel enthalten, obwohl dies durch die SELECT Syntaxbeschreibung (siehe Abschnitt 13.2.10,“ SELECT-Anweisung „), die INTO kann an verschiedenen Positionen angezeigt werden:

  • Vor FROM. Beispiel:

  • Vor einer abschließenden Sperrklausel. Beispiel:

  • Am Ende der SELECT. Beispiel:

Die INTO Position am Ende der Anweisung wird ab MySQL 8.0.20 unterstützt und ist die bevorzugte Position. Die Position vor einer Sperrklausel ist ab MySQL 8.0.20 veraltet. Erwarten Sie, dass die Unterstützung entfernt wird in af Zukünftige Version von MySQL. Mit anderen Worten, INTO nach FROM, jedoch nicht am Ende von SELECT erzeugt a Warnung.

Eine INTO -Klausel sollte nicht in einer verschachtelten SELECT verwendet werden, da eine solche SELECT muss sein Ergebnis in den äußeren Kontext zurückgeben. Es gibt auch Einschränkungen für die Verwendung von INTO in UNION -Anweisungen. siehe Abschnitt 13.2.10.3, „UNION-Klausel“.

Für die Variante INTO var_list :

  • var_list benennt eine Liste von einer oder mehreren Variablen, von denen jede eine benutzerdefinierte Variable, eine gespeicherte Prozedur oder ein Funktionsparameter sein kann oder gespeicherte lokale Programmvariable. (Innerhalb einer vorbereiteten SELECT ... INTO var_list -Anweisung sind nur benutzerdefinierte Variablen zulässig; siehe Abschnitt 13.6.4.2, „Umfang und Auflösung lokaler Variablen“. .)

  • Die ausgewählten Werte werden den Variablen zugewiesen. Die Anzahl der Variablen muss mit der Anzahl der Spalten übereinstimmen. Die Abfrage sollte eine einzelne Zeile zurückgeben. Wenn die Abfrage keine Zeilen zurückgibt, wird eine Warnung mit dem Fehlercode 1329 angezeigt (No data), und die Variablenwerte bleiben unverändert. Wenn die Abfrage mehrere Zeilen zurückgibt, tritt der Fehler 1172 auf (Result consisted of more than one row). Wenn es möglich ist, dass die Anweisung mehrere Zeilen abruft, können Sie LIMIT 1 verwenden, um die Ergebnismenge auf eine einzelne Zeile zu beschränken.

INTO var_list kann ebenfalls sein Wird mit einer TABLE -Anweisung verwendet, wobei folgende Einschränkungen gelten:

  • Die Anzahl der Variablen müssen mit der Anzahl der Spalten in der Tabelle übereinstimmen.

  • Wenn die Tabelle mehr als eine Zeile enthält, müssen Sie LIMIT 1 verwenden, um die Ergebnismenge auf eine einzelne Zeile zu beschränken. LIMIT 1 muss vor dem Schlüsselwort INTO stehen.

Ein Beispiel Eine solche Anweisung wird hier angezeigt:

Sie können auch Werte aus einer VALUES -Anweisung auswählen, die eine generiert einzelne Zeile in eine Reihe von Benutzervariablen. In diesem Fall müssen Sie einen Tabellenalias verwenden und jeden Wert aus der Werteliste einer Variablen zuweisen. Jede der beiden hier gezeigten Anweisungen entspricht SET @x=2, @y=4, @z=8:

Bei Benutzervariablennamen wird nicht zwischen Groß- und Kleinschreibung unterschieden . Siehe Abschnitt 9.4, „Benutzerdefinierte Variablen“.

Die SELECT ... INTO OUTFILE "file_name " -Form von SELECT schreibt die ausgewählten Zeilen in eine Datei. Die Datei wird auf dem Serverhost erstellt, daher müssen Sie über die Berechtigung FILE verfügen, um diese Syntax verwenden zu können. file_name kann keine vorhandene Datei sein, wodurch unter anderem verhindert wird, dass Dateien wie /etc/passwd und Datenbanktabellen geändert werden. Die Systemvariable character_set_filesystem steuert die Interpretation des Dateinamens.

Die Anweisung SELECT ... INTO OUTFILE soll das Speichern einer Tabelle in eine Textdatei auf dem Serverhost ermöglichen.Um die resultierende Datei auf einem anderen Host zu erstellen, ist SELECT ... INTO OUTFILE normalerweise ungeeignet, da es keine Möglichkeit gibt, einen Pfad in die Datei relativ zum Server-Host-Dateisystem zu schreiben, es sei denn, der Speicherort des Auf die Datei auf dem Remote-Host kann über einen Netzwerkpfad im Server-Host-Dateisystem zugegriffen werden.

Wenn die MySQL-Client-Software auf dem Remote-Host installiert ist, können Sie alternativ einen Client-Befehl wie mysql -e "SELECT ..." > file_name , um die Datei auf diesem Host zu generieren.

SELECT ... INTO OUTFILE ist das Komplement von LOAD DATA. Spaltenwerte werden in den in der Klausel CHARACTER SET angegebenen Zeichensatz konvertiert geschrieben. Wenn keine solche Klausel vorhanden ist, werden Werte mit dem Zeichensatz binary ausgegeben. Tatsächlich erfolgt keine Zeichensatzkonvertierung. Wenn eine Ergebnismenge Spalten in mehreren Zeichensätzen enthält, ist dies auch die Ausgabedatendatei, und es ist möglicherweise nicht möglich, die Datei korrekt neu zu laden.

Die Syntax für den export_options Teil der Anweisung besteht aus demselben FIELDS und LINES -Klauseln, die mit der Anweisung LOAD DATA verwendet werden. Informationen zu den Klauseln FIELDS und LINES, einschließlich ihrer Standardwerte und zulässigen Werte, finden Sie in Abschnitt 13.2.7, „LOAD DATA-Anweisung“.

FIELDS ESCAPED BY steuert, wie Sonderzeichen geschrieben werden. Wenn das Zeichen FIELDS ESCAPED BY nicht leer ist, wird es verwendet, wenn Dies ist erforderlich, um Mehrdeutigkeiten als Präfix vor den folgenden Zeichen bei der Ausgabe zu vermeiden:

  • Die FIELDS ESCAPED BY Zeichen

  • Das FIELDS ENCLOSED BY Zeichen

  • Das erste Zeichen des FIELDS TERMINATED BY und LINES TERMINATED BY Werte

  • ASCII NUL (das nullwertige Byte; was tatsächlich nach dem Escape-Zeichen geschrieben wird, ist ASCII 0, kein nullwertiges Byte)

Die FIELDS TERMINATED BY, ENCLOSED BY, ESCAPED BY , oder LINES TERMINATED BY Zeichen müssen maskiert werden, damit Sie die Datei zuverlässig wieder einlesen können. ASCII NUL wird maskiert, um die Anzeige mit einigen Pagern zu vereinfachen.

Die resultierende Datei muss nicht der SQL-Syntax entsprechen, sodass nichts anderes maskiert werden muss.

Wenn das Zeichen FIELDS ESCAPED BY leer ist, werden keine Zeichen maskiert und NULL wird als , nicht \N. Es ist wahrscheinlich keine gute Idee, ein leeres Escapezeichen anzugeben, insbesondere wenn Feldwerte in Ihren Daten eines der Zeichen in der gerade angegebenen Liste enthalten.

INTO OUTFILE kann auch mit einer TABLE -Anweisung verwendet werden, wenn Sie alle Spalten einer Tabelle in a sichern möchten Textdatei. In diesem Fall können die Reihenfolge und Anzahl der Zeilen mit ORDER BY und LIMIT gesteuert werden. Diese Klauseln müssen vor INTO OUTFILE stehen. TABLE ... INTO OUTFILE unterstützt dasselbe export_options wie SELECT ... INTO OUTFILE und unterliegt denselben Einschränkungen beim Schreiben in das Dateisystem. Ein Beispiel für eine solche Anweisung finden Sie hier:

Sie können auch SELECT ... INTO OUTFILE mit einer VALUES -Anweisung zum Schreiben verwenden Werte direkt in eine Datei. Hier wird ein Beispiel gezeigt:

Sie müssen einen Tabellenalias verwenden. Spaltenaliasnamen werden ebenfalls unterstützt und können optional verwendet werden, um Werte nur aus gewünschten Spalten zu schreiben. Sie können auch einige oder alle von SELECT ... INTO OUTFILE unterstützten Exportoptionen verwenden, um die Ausgabe in die Datei zu formatieren.

Hier ist ein Beispiel, das eine Datei im CSV-Format (Comma-Separated Values) erstellt, das von vielen Programmen verwendet wird:

Wenn Sie INTO DUMPFILE anstelle von INTO OUTFILE schreibt MySQL nur eine Zeile in die Datei, ohne Spalten- oder Zeilenabschluss und ohne Escape-Verarbeitung. Dies ist nützlich, um einen BLOB -Wert auszuwählen und in einer Datei zu speichern.

Hinweis

Jede Datei, die von INTO OUTFILE oder gehört dem Benutzer des Betriebssystems, unter dessen Konto mysqld ausgeführt wird. (Aus diesem und anderen Gründen sollten Sie mysqld niemals als root ausführen.) Ab MySQL 8.0.17 lautet die Umask für die Dateierstellung 0640; Sie müssen über ausreichende Zugriffsrechte verfügen, um den Dateiinhalt zu bearbeiten. Vor MySQL 8.0.17 lautet die Umask 0666 und die Datei kann von allen Benutzern auf dem Serverhost geschrieben werden.

Wenn die Systemvariable secure_file_priv auf einen nicht leeren Verzeichnisnamen festgelegt ist, muss sich die zu schreibende Datei in diesem Verzeichnis befinden.

Im Kontext von SELECT ... INTO -Anweisungen, die als Teil von Ereignissen auftreten, die vom Ereignisplaner ausgeführt werden, werden Diagnosemeldungen (nicht nur Fehler, sondern auch Warnungen) in das Fehlerprotokoll geschrieben und unter Windows in das Anwendungsereignisprotokoll. Weitere Informationen finden Sie in Abschnitt 25.4.5, „Status des Ereignisplaners“.

Ab MySQL 8.0.22 wird die regelmäßige Synchronisierung von Ausgabedateien unterstützt, in die SELECT INTO OUTFILE und SELECT INTO DUMPFILE, aktiviert durch Festlegen der in dieser Version eingeführten Serversystemvariablen select_into_disk_sync. Die Größe des Ausgabepuffers und die optionale Verzögerung können sein Mit select_into_buffer_size bzw. select_into_disk_sync_delay festlegen. Weitere Informationen finden Sie in den Beschreibungen dieser Systemvariablen.

Write a Comment

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.