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
wählt Spaltenwerte aus und speichert sie in Variablen.var_list
-
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 vorbereitetenSELECT ... INTO
-Anweisung sind nur benutzerdefinierte Variablen zulässig; siehe Abschnitt 13.6.4.2, „Umfang und Auflösung lokaler Variablen“. .)var_list
-
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 SieLIMIT 1
verwenden, um die Ergebnismenge auf eine einzelne Zeile zu beschränken.
INTO
kann ebenfalls sein Wird mit einer var_list
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üsselwortINTO
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 "
-Form von file_name
"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 ..." >
, um die Datei auf diesem Host zu generieren. file_name
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
undLINES TERMINATED BY
Werte -
ASCII
NUL
(das nullwertige Byte; was tatsächlich nach dem Escape-Zeichen geschrieben wird, ist ASCII0
, 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.
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.