LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name
' [REPLACE | IGNORE] INTO TABLEtbl_name
[FIELDS [TERMINATED BY 'string
'] [[OPTIONALLY] ENCLOSED BY 'char
'] [ESCAPED BY 'char
'] ] [LINES [STARTING BY 'string
'] [TERMINATED BY 'string
'] ] [IGNOREnumber
LINES] [(col_name_or_user_var
,...)] [SETcol_name
=expr
,...)]
Die Anweisung LOAD DATA INFILE
liest
Datensätze mit extrem hoher Geschwindigkeit aus einer Textdatei
in eine Tabelle ein. Der Dateiname muss als literaler String
übergeben werden.
Die Syntax für die FIELDS
- und
LINES
-Klauseln gilt auch für die
SELECT ... INTO OUTFILE
-Anweisung, die im
weiteren Verlauf dieses Abschnitts beschrieben wird. (Siehe auch
Abschnitt 13.2.7, „SELECT
“.)
Weitere Informationen zur Effektivität von
INSERT
im Vergleich zu LOAD DATA
INFILE
und zur Beschleunigung von LOAD DATA
INFILE
finden Sie in Abschnitt 7.2.16, „Geschwindigkeit von INSERT
-Anweisungen“.
Der von der Systemvariablen
character_set_database
angegebene Zeichensatz
wird zur Interpretation der Daten in der Datei verwendet.
SET NAMES
und die Einstellung von
character_set_client
wirken sich hingegen
nicht auf die Interpretation der Eingabe aus.
Beachten Sie, dass es derzeit nicht möglich ist, Datendateien
zu laden, die den Zeichensatz ucs2
verwenden.
Sie können Datendateien auch mithilfe des Hilfsprogramms
mysqlimport laden; dieses sendet dann eine
LOAD DATA INFILE
-Anweisung an den Server. Die
Option --local
bewirkt, dass
mysqlimport Datendateien vom Clienthost
liest. Sie können die Option --compress
angeben, um bei langsamen Netzwerken eine bessere Leistung zu
erzielen, sofern Client und Server das Komprimierungsprotokoll
unterstützen. Siehe auch Abschnitt 8.12, „mysqlimport — Programm zum Datenimport“.
Wenn Sie das Schlüsselwort LOW_PRIORITY
angeben, wird die Ausführung von LOAD DATA
verzögert, bis kein Client mehr aus der Tabelle liest.
Geben Sie CONCURRENT
bei einer
MyISAM
-Tabelle an, die die Bedingungen für
gleichzeitige Einfügeoperationen erfüllt (d. h. keine freien
Blöcke in der Mitte enthält), dann können andere Threads
Daten aus der Tabelle abrufen, während LOAD
DATA
ausgeführt wird. Die Verwendung dieser Option
beeinflusst die Leistungsfähigkeit von LOAD
DATA
auch dann geringfügig, wenn gleichzeitig kein
anderer Thread die Tabelle verwendet.
Das Schlüsselwort LOCAL
wird, sofern
angegeben, in Bezug auf die Clientseite der Verbindung
interpretiert:
Wenn LOCAL
angegeben ist, wird die Datei
vom Clientprogramm auf dem Clienthost gelesen und an den
Server geschickt. Die Datei kann als vollständiger Pfadname
angegeben werden, um die exakte Position zu beschreiben.
Erfolgt die Angabe als relativer Pfadname, dann wird der
Name relativ zum Verzeichnis interpretiert, in dem das
Clientprogramm gestartet wurde.
Wird LOCAL
nicht angegeben, dann muss die
Datei sich auf dem Serverhost befinden und wird direkt vom
Server gelesen. Der Server wendet zur Bestimmung der
Dateiposition die folgenden Regeln an:
Wenn der Dateiname absolut angegeben wurde, verwendet ihn der Server wie angegeben.
Ist der Dateiname ein relativer Pfadname mit einer oder mehreren am Anfang stehenden Komponenten, dann sucht der Server nach der Datei relativ zum eigenen Datenverzeichnis.
Wird ein Dateiname ohne Komponenten am Anfang übergeben, dann sucht der Server im Datenbankverzeichnis der Standarddatenbank nach der Datei.
Beachten Sie, dass, sofern keine LOCAL
-Option
angegeben wurde, die Regeln zur Folge haben, dass eine Datei
namens ./myfile.txt
im Datenverzeichnis des
Servers gesucht wird, während die Datei
myfile.txt
aus dem Datenbankverzeichnis der
Standarddatenbank gelesen wird. Ist also beispielsweise
db1
die Standarddatenbank, dann liest die
folgende LOAD DATA
-Anweisung die Datei
data.txt
aus dem Datenbankverzeichnis für
db1
aus, obwohl die Anweisung die Datei
explizit in die Datenbank db2
lädt:
LOAD DATA INFILE 'data.txt' INTO TABLE db2.my_table;
Windows-Pfadnamen müssen unter Verwendung von Schrägstrichen (statt Backslashs) angegeben werden. Wenn Sie Backslashs (umgekehrte Schrägstriche) verwenden, müssen Sie sie doppelt angeben.
Aus Sicherheitsgründen müssen Textdateien, die auf dem Server
ausgelesen werden, entweder im Datenbankverzeichnis liegen oder
von allen gelesen werden können. Außerdem benötigen Sie zur
Verwendung von LOAD DATA INFILE
für
Serverdateien die Berechtigung FILE
. Siehe
auch Abschnitt 5.8.3, „Von MySQL zur Verfügung gestellte Berechtigungen“.
Die Verwendung von LOCAL
ist ein wenig
langsamer als der Direktzugriff des Servers auf die Dateien,
weil der Inhalt der Datei vom Client über die Verbindung an den
Server gesendet werden muss. Die Berechtigung
FILE
benötigen Sie hingegen zum Laden
lokaler Dateien nicht.
Die Option LOCAL
funktioniert nur, wenn ihre
Verwendung sowohl am Client als auch am Server aktiviert wurde.
Wenn beispielsweise mysqld mit
--local-infile=0
gestartet wurde, funktioniert
LOCAL
nicht. Siehe auch
Abschnitt 5.7.4, „Sicherheitsprobleme mit LOAD DATA LOCAL
“.
Unter Unix können Sie, wenn LOAD DATA
über
eine Pipe lesen soll, die folgende Methode verwenden (hierbei
laden wir das Listing des Verzeichnisses /
in eine Tabelle):
mkfifo /mysql/db/x/x chmod 666 /mysql/db/x/x find / -ls > /mysql/db/x/x mysql -e "LOAD DATA INFILE 'x' INTO TABLE x" x
Die Schlüsselwörter REPLACE
und
IGNORE
steuern den Umgang mit eingegebenen
Datensätzen, die Duplikate vorhandener Datensätze mit
eindeutigen Schlüsselwerten darstellen.
Wenn Sie REPLACE
angeben, ersetzt die Eingabe
vorhandene Datensätze. Dies betrifft Datensätze, die denselben
Wert bei einem Primärschlüssel oder einem eindeutigen Index
wie die neuen Datensätze haben. Siehe auch
Abschnitt 13.2.6, „REPLACE
“.
Bei Angabe von IGNORE
hingegen werden neue
Datensätze, deren eindeutiger Schlüsselwert bereits einem
vorhandenen Datensatz zugewiesen ist, ignoriert. Wenn Sie keine
Option angeben, hängt das Verhalten davon ab, ob das
Schlüsselwort LOCAL
angegeben wird. Ohne
LOCAL
tritt ein Fehler auf, wenn ein
doppelter Schlüsselwert gefunden wird; in diesem Fall wird der
Rest der Textdatei ignoriert. Mit LOCAL
ist
das Standardverhalten so, als ob IGNORE
angegeben worden wäre. Das liegt daran, dass der Server keine
Möglichkeit hat, die Übertragung der Datei während des
Vorgangs zu beenden.
Wenn Sie Fremdschlüssel-Constraints während des Ladevorgangs
ignorieren wollen, können Sie eine SET
FOREIGN_KEY_CHECKS=0
-Anweisung vor der Ausführung von
LOAD DATA
absetzen.
Wenn Sie LOAD DATA INFILE
auf eine leere
MyISAM
-Tabelle anwenden, werden alle
nichteindeutigen Indizes in einer separaten Stapeloperation
erstellt (wie bei REPAIR TABLE
). Dies sollte
LOAD DATA INFILE
erheblich beschleunigen,
wenn Sie viele Indizes haben. In einigen Extremfällen können
Sie die Indizes noch schneller erstellen, indem Sie sie vor dem
Einladen der Datei in die Tabelle mit ALTER TABLE ...
DISABLE KEYS
abschalten und sie nach Abschluss des
Ladevorgangs mit ALTER TABLE ... ENABLE KEYS
neu erstellen. Siehe auch Abschnitt 7.2.16, „Geschwindigkeit von INSERT
-Anweisungen“.
LOAD DATA INFILE
ist das Gegenstück zu
SELECT ... INTO OUTFILE
. (Siehe auch
Abschnitt 13.2.7, „SELECT
“.) Um Daten aus einer Tabelle in eine
Datei zu schreiben, benutzen Sie SELECT ... INTO
OUTFILE
; wollen Sie die Datei wieder in eine Tabelle
einlesen, dann verwenden Sie LOAD DATA
INFILE
. Die Syntax der Klauseln
FIELDS
und LINES
ist bei
beiden Anweisungen dieselbe. Beide sind optional, aber
FIELDS
muss LINES
vorangehen, sofern beide angegeben sind.
Wenn Sie eine FIELDS
-Klausel festlegen, ist
auch jede einzelne Unterklausel (TERMINATED
BY
, [OPTIONALLY] ENCLOSED BY
und
ESCAPED BY
) ebenfalls optional – Sie
müssen lediglich mindestens eine dieser Unterklauseln angeben.
Wenn Sie keine FIELDS
-Klausel angeben,
entsprechen die Vorgabeeinstellungen dem Folgenden:
FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\'
Wenn Sie keine LINES
-Klausel angeben,
entsprechen die Vorgabeeinstellungen dem Folgenden:
LINES TERMINATED BY '\n' STARTING BY ''
Anders gesagt, die Standardwerte bewirken, dass LOAD
DATA INFILE
sich beim Einlesen wie folgt verhält:
Es wird nach Zeilenbegrenzungen bei Zeilenumbrüchen gesucht.
Zeilenpräfixe werden nicht übersprungen.
Zeilen werden bei Tabulatoren in Felder unterteilt.
Felder müssen nicht innerhalb von Anführungszeichen abgeschlossen werden.
Fälle von Tabulatoren, Zeilenumbrüchen oder
‘\
’, denen
‘\
’ vorangeht, werden als
literale Zeichen interpretiert, die Teile von Feldwerten
sind.
Umgekehrt bewirken die Voreinstellungen, dass sich
SELECT ... INTO OUTFILE
beim Schreiben einer
Ausgabe wie folgt verhält:
Tabulatoren werden zwischen Felder gesetzt.
Mehrere Felder werden nicht zwischen Anführungszeichen gesetzt.
‘\
’ wird zur Kennzeichnung
von Tabulatoren, Zeilenumbrüchen und
‘\
’ verwendet, die innerhalb
von Feldwerten auftreten.
Am Ende von Zeilen werden Zeilenumbrüche geschrieben.
Der Backslash wird bei MySQL als Escape-Zeichen in Strings
verwendet. Insofern müssen Sie, um FIELDS ESCAPED BY
'\\'
zu schreiben, zwei Backslashes angeben, damit der
Wert als ein Backslash interpretiert wird.
Hinweis: Wenn Sie die Textdatei
auf einem Windows-System erzeugt haben, müssen Sie unter
Umständen LINES TERMINATED BY '\r\n'
verwenden, um die Datei korrekt einzulesen, weil
Windows-Programme normalerweise zwei Zeichen als
Zeilenendzeichen verwenden. Einige Programme wie WordPad
verwenden beim Schreiben von Dateien unter Umständen sogar
\r
als Zeilenendzeichen. Um solche Dateien zu
lesen, verwenden Sie LINES TERMINATED BY
'\r'
.
Wenn alle Zeilen, die Sie einlesen wollen, ein gemeinsames
Präfix aufweisen, das Sie ignorieren wollen, können Sie mit
LINES STARTING BY
'
das Präfix
und alles, was davor steht, überspringen.
Enthält eine Zeile das Präfix gar nicht, dann wird die gesamte
Zeile übersprungen. Nehmen wir an, dass Sie folgende Anweisung
absetzen:
prefix_string
'
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test FIELDS TERMINATED BY ',' LINES STARTING BY 'xxx';
Nehmen wir ferner an, dass die Datendatei wie folgt aussieht:
xxx"abc",1 something xxx"def",2 "ghi",3
In diesem Fall werden als Ergebnis die Datensätze
("abc",1)
und ("def",2)
erzeugt. Der dritte Datensatz in der Datei wird übersprungen,
weil er das Präfix nicht enthält.
Die Option IGNORE
kann verwendet werden, um Zeilen am Anfang der
Datei zu ignorieren. So können Sie etwa number
LINESIGNORE 1
LINES
angeben, um eine Kopfzeile zu überspringen, die
etwa die Spaltennamen enthält:
LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test IGNORE 1 LINES;
Wenn Sie SELECT ... INTO OUTFILE
gemeinsam
mit LOAD DATA INFILE
verwenden, um Daten aus
einer Datenbank in eine Datei zu schreiben und die Datei später
wieder in die Datenbank einzulesen, dann müssen die Optionen
der beiden Anweisungen zur Behandlung von Feldern und Zeilen
einander entsprechen. Andernfalls kann LOAD DATA
INFILE
den Inhalt der Datei nicht korrekt einlesen.
Angenommen, Sie schreiben mit SELECT ... INTO
OUTFILE
eine Datei mit Feldern, die kommagetrennt
sind:
SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM table2;
Um diese kommagetrennte Datei wieder einzulesen, müssen Sie folgende Anweisung verwenden:
LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY ',';
Haben Sie stattdessen probiert, die Datei mit der folgenden
Anweisung einzulesen, dann ist dies nicht gelungen, da
LOAD DATA INFILE
angewiesen wird, nach
Tabulatoren zwischen den Feldern zu suchen:
LOAD DATA INFILE 'data.txt' INTO TABLE table2 FIELDS TERMINATED BY '\t';
Infolgedessen wird jede Eingabezeile wohl als separates Feld interpretiert werden.
Mit LOAD DATA INFILE
können Sie Dateien
lesen, die Sie aus externen Quellen erhalten haben.
Beispielsweise exportieren viele Programme Daten als
kommagetrennte Werte im so genannten CSV-Format (Comma-Separate
Values). Hierbei werden die Felder durch Kommata voneinander
getrennt und in doppelte Anführungszeichen gesetzt. Wenn Zeilen
in einer solchen Datei durch Zeilenumbrüche abgeschlossen
werden, veranschaulicht die folgende Anweisung die Optionen zur
Feld- und Zeilenbehandlung, wie Sie sie zum Laden der Datei
verwenden würden:
LOAD DATA INFILE 'data.txt' INTO TABLE tbl_name
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Alle Optionen zur Feld- und Zeilenbehandlung können einen
Leer-String (''
) angeben. Wenn der String
nicht leer ist, müssen die Werte FIELDS [OPTIONALLY]
ENCLOSED BY
und FIELDS ESCAPED BY
genau ein Zeichen umfassen. Die Werte FIELDS TERMINATED
BY
, LINES STARTING BY
und
LINES TERMINATED BY
können hingegen auch
mehrere Zeichen enthalten. Um etwa Zeilen zu schreiben, die
jeweils aus einem aus einer Absatzschaltung und einem
Zeilenvorschub bestehenden Zeichenpaar bestehen, geben Sie die
Klausel LINES TERMINATED BY '\r\n'
an.
Um eine Datei mit Witzen zu lesen, die durch aus
%%
bestehenden Zeilen getrennt sind, können
Sie Folgendes tun:
CREATE TABLE jokes (a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, joke TEXT NOT NULL); LOAD DATA INFILE '/tmp/jokes.txt' INTO TABLE jokes FIELDS TERMINATED BY '' LINES TERMINATED BY '\n%%\n' (joke);
FIELDS [OPTIONALLY] ENCLOSED BY
steuert die
Anführungszeichen um die Felder. Bei der Ausgabe
(SELECT ... INTO OUTFILE
) werden, wenn Sie
das Wort OPTIONALLY
weglassen, alle Felder
vom durch ENCLOSED BY
angegebenen Zeichen
umschlossen. Hier ein Beispiel für eine solche Ausgabe (mit dem
Komma als Feldtrennzeichen):
"1","a string","100.20" "2","a string containing a , comma","102.20" "3","a string containing a \" quote","102.20" "4","a string containing a \", quote and comma","102.20"
Wenn Sie OPTIONALLY
angeben, wird das
ENCLOSED BY
-Zeichen nur zum Umschließen von
Werten in Spalten verwendet, die einen String-Datentyp haben
(z. B. CHAR
, BINARY
,
TEXT
oder ENUM
):
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a \" quote",102.20 4,"a string containing a \", quote and comma",102.20
Beachten Sie, dass das Auftreten des ENCLOSED
BY
-Zeichens in einem Feldwert gekennzeichnet wird,
indem man ihm das ESCAPED BY
-Zeichen
voranstellt. Ferner ist wichtig, dass es, wenn Sie einen leeren
ESCAPED BY
-Wert angeben, möglich ist,
versehentlich eine Ausgabe zu erzeugen, die von LOAD
DATA INFILE
nicht korrekt eingelesen werden kann. Die
obige Ausgabe beispielsweise würde wie folgt angezeigt werden,
wenn das Escape-Zeichen leer wäre. Sie werden bemerken, dass
das zweite Feld in der vierten Zeile ein auf das
Anführungszeichen folgendes Komma enthält, welches das Feld
abzuschließen scheint (was nicht zutrifft).
1,"a string",100.20 2,"a string containing a , comma",102.20 3,"a string containing a " quote",102.20 4,"a string containing a ", quote and comma",102.20
Bei der Eingabe wird das ENCLOSED BY
-Zeichen
– sofern vorhanden – am Ende der jeweiligen Feldwerte
entfernt. (Dies erfolgt unabhängig davon, ob
OPTIONALLY
angegeben ist oder nicht –
OPTIONALLY
hat keine Auswirkung auf die
Eingabeinterpretation.) Instanzen des ENCLOSED
BY
-Zeichens, denen das ESCAPED
BY
-Zeichen vorangestellt ist, werden als Teil des
aktuellen Feldwerts interpretiert.
Beginnt das Feld mit dem ENCLOSED BY
-Zeichen,
dann werden Instanzen dieses Zeichens nur dann als
Feldtrennzeichen ausgewertet, wenn ihnen jeweils die
TERMINATED BY
-Sequenz für Feld oder Zeile
folgt. Um Mehrdeutigkeiten zu vermeiden, können Fälle des
ENCLOSED BY
-Zeichens innerhalb eines
Feldwerts verdoppelt werden; sie werden dann als einzelne
Instanz des Zeichens ausgewertet. Wird also etwa
ENCLOSED BY '"'
angegeben, dann wird mit
Anführungszeichen wie hier gezeigt verfahren:
"The ""BIG"" boss" -> The "BIG" boss The "BIG" boss -> The "BIG" boss The ""BIG"" boss -> The ""BIG"" boss
FIELDS ESCAPED BY
steuert, wie Sonderzeichen
geschrieben oder gelesen werden. Wenn das FIELDS
ESCAPED BY
-Zeichen nicht leer ist, dann wird es bei
der Ausgabe als Präfix für die folgenden Zeichen verwendet:
FIELDS ESCAPED BY
-Zeichen
FIELDS [OPTIONALLY] ENCLOSED BY
-Zeichen
das erste Zeichen der Werte FIELDS TERMINATED
BY
und LINES TERMINATED BY
ASCII 0
(eigentlich wird auf das
Escape-Zeichen folgend ASCII
‘0
’ und kein Nullwertbyte
geschrieben)
Ist das FIELDS ESCAPED BY
-Zeichen leer, dann
werden keinerlei Zeichen gekennzeichnet und
NULL
wird als NULL
(und
nicht als \N
) ausgegeben. Es ist
wahrscheinlich nicht angeraten, ein leeres Escape-Zeichen
anzugeben; dies gilt insbesondere dann, wenn Feldwerte in Ihren
Daten eines der in der obigen Liste enthaltenen Zeichen
enthalten.
Wenn das FIELDS ESCAPED BY
-Zeichen nicht leer
ist, werden Instanzen dieses Zeichens bei der Eingabe entfernt,
und das nachfolgende Zeichen wird literal als Teil des Feldwerts
verwendet. Ausnahmen sind die gekennzeichneten Zeichen
‘0
’ oder
‘N
’ (z. B. \0
oder \N
, wenn das Escape-Zeichen
‘\
’ ist). Diese Sequenzen werden
als ASCII-NUL (Nullwertbyte) bzw. als NULL
interpretiert. Die Regeln für den Umgang mit
NULL
werden im weiteren Verlauf dieses
Abschnitts beschrieben.
Weitere Informationen zur
‘\
’-Escape-Syntax finden Sie in
Abschnitt 9.1, „Literale: wie Strings und Zahlen geschrieben werden“.
In bestimmten Fällen interagieren die Optionen zur Feld- und Zeilenbehandlung:
Wenn LINES TERMINATED BY
ein Leer-String
und FIELDS TERMINATED BY
nicht leer ist,
werden Zeilen auch mit FIELDS TERMINATED
BY
abgeschlossen.
Sind die Werte von FIELDS TERMINATED BY
und FIELDS ENCLOSED BY
beide leer
(''
), dann wird ein festes
Datensatzformat (ohne Trennzeichen) verwendet. Bei einem
solchen Format fehlt zwar das Trennzeichen, ein
Zeilenabschlusszeichen kann aber nichtsdestoweniger
vorhanden sein. Stattdessen werden Spaltenwerte unter
Berücksichtigung der Anzeigebreiten der Spalten geschrieben
und gelesen. Wird z. B. eine Spalte als
INT(7)
deklariert, dann werden Werte für
diese Spalte unter Verwendung von Feldern mit einer Länge
von sieben Zeichen geschrieben. Bei der Eingabe werden die
Spaltenwerte dann ermittelt, indem sieben Zeichen ausgelesen
werden.
LINES TERMINATED BY
wird nach wie vor zur
Trennung von Zeilen verwendet. Wenn eine Zeile nicht alle
Felder enthält, werden die verbleibenden Spalten auf ihre
Vorgabewerte gesetzt. Wenn kein Zeilenabschlusszeichen
vorhanden ist, sollten Sie dieses auf ''
setzen. In diesem Fall muss die Textdatei alle Felder für
jeden Datensatz enthalten.
Das Festformat für Datensätze beeinflusst auch den Umgang
mit NULL
-Werten (siehe unten). Beachten
Sie, dass dieses Format nicht funktioniert, wenn Sie einen
Multibytezeichensatz verwenden.
Die Handhabung von NULL
-Werten variiert
entsprechend den verwendeten FIELDS
- und
LINES
-Optionen:
Bei den FIELDS
- und
LINES
-Standardwerten wird
NULL
als Feldwert \N
in die Ausgabe geschrieben. Analog wird der Feldwert
\N
bei der Eingabe als
NULL
gelesen (vorausgesetzt, das
ESCAPED BY
-Zeichen ist
‘\
’).
Wenn FIELDS ENCLOSED BY
nicht leer ist,
dann wird ein Feld, das das Wort NULL
als
Wert enthält, als NULL
-Wert gelesen.
Dies unterscheidet sich von dem Wort
NULL
, wenn es in FIELDS ENCLOSED
BY
-Zeichen gesetzt ist – dieses wird als
'NULL'
gelesen.
Ist FIELDS ESCAPED BY
leer, dann wird
NULL
als Wort NULL
geschrieben.
Beim Festformat (welches verwendet wird, wenn
FIELDS TERMINATED BY
und FIELDS
ENCLOSED BY
beide leer sind), wird
NULL
als Leer-String geschrieben.
Beachten Sie, dass dies zur Folge hat, dass
NULL
-Werte und Leer-Strings in der
Tabelle nicht mehr unterschieden werden können, sobald sie
in die Datei geschrieben werden, weil beide als Leer-Strings
geschrieben werden. Müssen die beiden Werte nach dem
Wiedereinlesen der Datei weiterhin unterscheidbar sein, dann
sollten Sie das Festformat nicht verwenden.
Manche Fälle werden von LOAD DATA INFILE
nicht unterstützt:
Datensätze fester Länge (FIELDS TERMINATED
BY
und FIELDS ENCLOSED BY
sind
leer) und BLOB
- oder
TEXT
-Spalten.
Wenn Sie ein Trennzeichen angeben, das mit einem anderen
Trennzeichen (oder dessen Präfix) identisch ist, kann
LOAD DATA INFILE
die Eingabe nicht
korrekt interpretieren. Die folgende
FIELDS
-Klausel beispielsweise würde
Probleme verursachen:
FIELDS TERMINATED BY '"' ENCLOSED BY '"'
Wenn FIELDS ESCAPED BY
leer ist, bewirkt
ein Feldwert, der eine Instanz von FIELDS ENCLOSED
BY
oder LINES TERMINATED BY
gefolgt vom FIELDS TERMINATED BY
-Wert
enthält, dass LOAD DATA INFILE
das
Einlesen eines Felds oder einer Zeile zu früh beendet. Dies
geschieht, weil LOAD DATA INFILE
nicht
genau bestimmen kann, wo der Feld- oder Zeilenwert endet.
Das folgende Beispiel lädt alle Spalten der Tabelle
persondata
:
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata;
Standardmäßig wird, wenn keine Spaltenliste am Ende der
LOAD DATA INFILE
-Anweisung vorhanden ist,
erwartet, dass Eingabezeilen ein Feld für jede Tabellenspalte
enthalten. Wenn Sie nur einen Teil der Spalten einer Tabelle
laden wollen, müssen Sie eine Spaltenliste angeben:
LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
Ferner müssen Sie eine Spaltenliste festlegen, wenn die Reihenfolge der Felder in der Eingabedatei sich von der Reihenfolge der Spalten in der Tabelle unterscheidet. Andernfalls kann MySQL nicht ermitteln, wie die Eingabefelder den Tabellenspalten zuzuordnen sind.
Die Spaltenliste kann entweder Spaltennamen oder
Benutzervariablen enthalten. Bei Benutzervariablen gestattet
Ihnen die SET
-Klausel die Durchführung einer
Werteumwandlung vor der Zuweisung des Ergebnisses zu den
Spalten.
Benutzervariablen in der SET
-Klausel können
auf unterschiedliche Weise verwendet werden. Die folgenden Werte
benutzen die erste Eingabespalte direkt für den Wert von
t1.column1
und weisen die zweite
Eingabespalte einer Benutzervariablen zu, an der eine Division
durchgeführt wird, bevor sie als Wert für
t1.column2
verwendet wird:
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @var1) SET column2 = @var1/100;
Die SET
-Klausel kann zur Übermittlung von
Werten benutzt werden, die nicht der Eingabedatei entnommen
wurden. Die folgende Anweisung weist column3
das aktuelle Datum und die Uhrzeit zu:
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, column2) SET column3 = CURRENT_TIMESTAMP;
Sie können einen Eingabewert auch verwerfen, indem Sie ihn einer Benutzervariablen zuweisen, der Variablen aber keine Tabellenspalte zuordnen:
LOAD DATA INFILE 'file.txt' INTO TABLE t1 (column1, @dummy, column2, @dummy, column3);
Die Verwendung der Spalten-/Variablenliste und der
SET
-Klausel ist den folgenden
Einschränkungen unterworfen:
Zuordnungen in der SET
-Klausel sollten
auf der linken Seite des Zuweisungsoperators nur
Spaltennamen aufweisen.
Auf der rechten Seite einer SET
-Zuordnung
dürfen auch Unterabfragen zum Einsatz kommen. Eine
Unterabfrage, die einen Wert zurückgibt, der einer Spalte
zugeordnet werden soll, darf nur eine skalare Unterabfrage
sein. Außerdem können Sie eine Unterabfrage nicht für
Auswahlabfragen an die Tabelle verwenden, die gerade geladen
wird.
Zeilen, die von einer IGNORE
-Klausel
ignoriert werden, werden für die Spalten-/Variablenliste
oder die SET
-Klausel nicht verarbeitet.
Benutzervariablen können nicht verwendet werden, wenn Daten mit Festformat geladen werden, da Benutzervariablen keine Anzeigebreite haben.
Wenn eine Eingabezeile verarbeitet wird, unterteilt
LOAD DATA
sie in Felder und verwendet die
Werte entsprechend der Spalten-/Variablenliste und der
SET
-Klausel, sofern diese vorhanden sind. Der
Ergebnisdatensatz wird dann in die Tabelle eingefügt. Sind
BEFORE INSERT
- oder AFTER
INSERT
-Trigger für die Tabelle vorhanden, so werden
diese vor bzw. nach dem Einfügen des Datensatzes aktiviert.
Hat eine Eingabezeile zu viele Felder, dann werden die überzähligen Felder ignoriert und die Anzahl der Warnungen wird erhöht.
Hat eine Eingabezeile zu wenig Felder, dann werden die Tabellenspalten, deren Eingabefelder fehlen, auf ihre Standardwerte gesetzt. Die Zuweisung von Standardwerten ist in Abschnitt 11.1.4, „Vorgabewerte von Datentypen“, beschrieben.
Ein leerer Feldwert wird anders interpretiert als ein fehlender Feldwert:
Bei String-Typen wird die Spalte auf den Leer-String gesetzt.
Bei numerischen Typen wird die Spalte auf
0
gesetzt.
Bei zeitbezogenen Typen wird die Spalte auf den passenden „Nullwert“ des Typs gesetzt. Siehe auch Abschnitt 11.3, „Datums- und Zeittypen“.
Dies sind dieselben Werte, die als Ergebnis ausgegeben werden,
wenn Sie einem String, einem numerischen oder einem
zeitbezogenen Wert in einer INSERT
- oder
UPDATE
-Anweisung explizit den Leer-String
zuweisen.
TIMESTAMP
-Spalten werden nur dann auf die
aktuellen Werte für Datum und Uhrzeit gesetzt, wenn ein
NULL
-Wert (d. h. \N
) für
die Spalte vorhanden ist oder der Standardwert der
TIMESTAMP
-Spalte der aktuelle Zeitstempel ist
und in der Feldliste (sofern vorhanden) weggelassen wurde.
LOAD DATA INFILE
betrachtet alle Eingaben als
Strings, d. h., Sie können für ENUM
- oder
SET
-Spalten numerische Werte nicht so
eingeben wie von INSERT
-Anweisungen her
gewohnt. Alle ENUM
- und
SET
-Werte müssen als Strings angegeben
werden.
Wenn die LOAD DATA INFILE
-Anweisung
abgeschlossen ist, gibt sie einen Informations-String im
folgenden Format zurück:
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
Wenn Sie die C-API verwenden, können Sie Informationen zur
Anweisung durch einen Aufruf der Funktion
mysql_info()
ermitteln. Siehe auch
Abschnitt 24.2.3.34, „mysql_info()
“.
Warnungen treten unter denselben Umständen auf wie beim
Einfügen von Werten mithilfe der
INSERT
-Anweisung (siehe
Abschnitt 13.2.4, „INSERT
“); der einzige Unterschied besteht
darin, dass LOAD DATA INFILE
auch dann
Warnungen erzeugt, wenn zu wenig oder zu viel Felder im
Eingabedatensatz vorhanden sind. Die Warnungen werden nirgends
gespeichert; Sie können ihrer Anzahl lediglich entnehmen, ob
alles geklappt hat oder nicht.
Mit SHOW WARNINGS
erhalten Sie eine Liste der
ersten max_error_count
Warnungen mit
Informationen dazu, was unter Umständen nicht geklappt hat.
Siehe auch Abschnitt 13.5.4.25, „SHOW WARNINGS
“.
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.