[+/-]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[(col_name
,...)] VALUES ({expr
| DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
Oder:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
SETcol_name
={expr
| DEFAULT}, ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
Oder:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[(col_name
,...)] SELECT ... [ ON DUPLICATE KEY UPDATEcol_name
=expr
, ... ]
INSERT
fügt neue Datensätze in eine
vorhandene Tabelle ein. Die Formen INSERT ...
VALUES
und INSERT ... SET
der
Anweisung fügen Datensätze basierend auf explizit angegebenen
Werten ein. Die Form INSERT ... SELECT
fügt
Datensätze ein, die in einer oder mehreren anderen Tabellen
ausgewählt wurden. INSERT ... SELECT
wird in
Abschnitt 13.2.4.1, „INSERT ... SELECT
“, näher erläutert.
Sie können REPLACE
anstelle von
INSERT
verwenden, um alte Datensätze zu
überschreiben. REPLACE
ist das Gegenstück
zu INSERT IGNORE
bei der Behandlung neuer
Datensätze, deren eindeutige Schlüsselwerte Dubletten bereits
vorhandener Datensätze sind: Die neuen Datensätze ersetzen die
alten, statt verworfen zu werden. Siehe auch
Abschnitt 13.2.6, „REPLACE
“.
tbl_name
ist die Tabelle, in die die
Datensätze eingefügt werden sollen. Die Spalten, für die die
Anweisung Werte angibt, lassen sich wie folgt angeben:
Sie können eine kommagetrennte Liste von Spaltennamen
gefolgt vom Tabellennamen angeben. In diesem Fall muss für
jede genannte Spalte in der VALUES
-Liste
oder der SELECT
-Anweisung ein Wert
vorhanden sein.
Wenn Sie keine Liste mit Spaltennamen für INSERT
... VALUES
oder INSERT ...
SELECT
angeben, dann müssen die Werte für alle
Spalten in der Tabelle in der
VALUES
-Liste oder der
SELECT
-Anweisung vorhanden sein. Wenn Sie
die Reihenfolge der Spalten in der Tabelle nicht kennen,
ermitteln Sie sie mit DESCRIBE
.
tbl_name
Die SET
-Klausel gibt die Spaltennamen
ausdrücklich an.
Spaltenwerte lassen sich auf mehrerlei Weise übergeben:
Wenn Sie MySQL nicht im strikten SQL-Modus ausführen, dann wird jede Spalte, für die kein Wert angegeben wird, auf den (expliziten oder impliziten) Standardwert gesetzt. Wenn Sie also etwa eine Spaltenliste angeben, die nicht alle Spalten in der Tabelle aufführt, werden nicht genannte Spalten auf ihre jeweiligen Standardwerte gesetzt. Die Zuweisung von Standardwerten ist in Abschnitt 11.1.4, „Vorgabewerte von Datentypen“, beschrieben. Siehe auch Abschnitt 1.9.6.2, „Constraints auf ungültigen Daten“.
Wenn Sie wollen, dass eine
INSERT
-Anweisung einen Fehler erzeugt,
wenn Sie nicht alle Werte für alle Spalten ausdrücklich
angeben, für die kein Standardwert vorhanden ist, dann
sollten Sie den strikten Modus verwenden. Siehe auch
Abschnitt 5.2.5, „Der SQL-Modus des Servers“.
Mit dem Schlüsselwort DEFAULT
können
Sie eine Spalte explizit auf ihren Standardwert setzen. Dies
erleichtert das Formulieren von
INSERT
-Anweisungen, die allen Spalten
(bis auf einigen wenigen) Werte zuweisen, denn so brauchen
Sie keine unvollständige VALUES
-Liste zu
erstellen, die nicht für jede Spalte in der Tabelle einen
Wert enthält. Andernfalls müssten Sie die Liste der
Spaltennamen ausschreiben, die den einzelnen Werten in der
VALUES
-Liste entspricht.
Sie können auch
DEFAULT(
als eine allgemeinere Form benutzen, mit der in Ausdrücken
der Standardwert einer gegebenen Spalte erzeugt werden kann.
col_name
)
Wenn sowohl die Spaltenliste als auch die
VALUES
-Liste leer sind, erstellt
INSERT
einen Datensatz, bei dem jede
Spalte auf den jeweiligen Standardwert gesetzt ist:
INSERT INTO tbl_name
() VALUES();
Im strikten Modus tritt ein Fehler auf, wenn nicht für jede Spalte ein Standardwert angegeben ist. Andernfalls verwendet MySQL den impliziten Standardwert für jede Spalte, der kein expliziter Wert zugewiesen ist.
Sie können den Spaltenwert auch durch einen Ausdruck
expr
angeben. Dies kann eine
Typenkonvertierung bedingen, wenn der Ausdruckstyp nicht dem
Typ der Spalte entspricht. Die Konvertierung eines gegebenen
Werts kann je nach Datentyp zu unterschiedlichen
Einfügewerten führen. So hat z. B. das Einfügen des
Strings '1999.0e-2'
in eine
INT
-. FLOAT
-,
DECIMAL(10,6)
- oder
YEAR
-Spalte die Einfügewerte
1999
, 19.9921
,
19.992100
bzw. 1999
zur Folge. Der Grund dafür, dass der in den
INT
- und YEAR
-Spalten
gespeicherte Wert 1999
ist, besteht
darin, dass bei der Konvertierung des Strings in den Integer
nur der Teil des Strings berücksichtigt wird, der als
gültiger Integer bzw. als sinnvolle Jahresangabe betrachtet
wird. Bei Fließkomma- und Festkommaspalten wird bei der
Umwandlung des Strings in einen Fließkommawert der gesamte
String als zulässiger Fließkommawert betrachtet.
Ein Ausdruck expr
kann jede
Spalte referenzieren, die zuvor in einer Werteliste
eingestellt wurde. Sie könnten dies beispielsweise tun,
weil der Wert von col2
die zuvor
zugewiesene Spalte col1
referenziert:
INSERT INTO tbl_name
(col1,col2) VALUES(15,col1*2);
Die folgende Variante ist jedoch nicht zulässig, weil der
Wert für col1
die Spalte
col2
referenziert, die jedoch erst nach
col1
zugewiesen wurde:
INSERT INTO tbl_name
(col1,col2) VALUES(col2*2,15);
Eine Ausnahme betrifft Spalten, die
AUTO_INCREMENT
-Werte enthalten. Weil der
AUTO_INCREMENT
-Wert nach anderen
Wertezuweisungen erzeugt wird, gibt eine Referenzierung
einer AUTO_INCREMENT
-Spalte
0
zurück.
INSERT
-Anweisungen, die die
VALUES
-Syntax verwenden, können mehrere
Datensätze einfügen. Zu diesem Zweck fügen Sie mehrere Listen
mit Spaltenwerten ein, die jeweils in Klammern gesetzt und durch
Kommata getrennt sind. Beispiel:
INSERT INTO tbl_name
(a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Die Werteliste für jeden Datensatz muss in Klammern gesetzt werden. Die folgende Anweisung ist unzulässig, weil die Anzahl der Werte in der Liste nicht der Anzahl der Spaltennamen entspricht:
INSERT INTO tbl_name
(a,b,c) VALUES(1,2,3,4,5,6,7,8,9);
Der Wert der von einer INSERT
-Anweisung
betroffenen Datensätze kann mit der C-API-Funktion
mysql_affected_rows()
ermittelt werden. Siehe
auch Abschnitt 24.2.3.1, „mysql_affected_rows()
“.
Wenn Sie eine INSERT ... VALUES
-Anweisung mit
mehreren Wertelisten oder INSERT ... SELECT
verwenden, gibt die Anweisung einen Informations-String im
folgenden Format zurück:
Records: 100 Duplicates: 0 Warnings: 0
Records
gibt die Anzahl der von der Anweisung
verarbeiteten Datensätze zurück. (Dies entspricht nicht
unbedingt der Anzahl der tatsächlich eingefügten Datensätze,
weil Duplicates
auch ungleich null sein
kann.) Duplicates
gibt die Anzahl der
Datensätze an, die nicht eingefügt wurden, weil eindeutige
Schlüsselwerte andernfalls dupliziert worden wären.
Warnings
gibt die Anzahl der
Spalteneinfügeversuche an, die aus irgendeinem Grund
problematisch waren. Warnungen können unter den folgenden
Umständen auftreten:
Einfügen von NULL
in eine Spalte, die
als NOT NULL
deklariert wurde. Bei
INSERT
-Anweisung für mehrere Datensätze
oder INSERT INTO ... SELECT
-Anweisungen
wird die Spalte auf den impliziten Standardwert für den
betreffenden Spaltendatentyp gesetzt. Bei numerischen Typen
ist dies 0
, bei String-Typen der
Leer-String (''
) und der
„Nullwert“ bei Datums- und Uhrzeittypen.
INSERT INTO ... SELECT
-Anweisungen werden
auf die gleiche Weise behandelt wie Einfügeoperationen für
mehrere Datensätze, weil der Server die Ergebnismenge von
SELECT
nicht darauf überprüft, ob genau
ein Datensatz zurückgegeben wird. (Bei
INSERT
-Anweisungen für nur einen
Datensatz erscheint keine Warnung, wenn
NULL
in eine NOT
NULL
-Spalte eingefügt wird. Stattdessen schlägt
die Anweisung mit einem Fehler fehl.)
Setzen einer numerischen Spalte auf einen Wert außerhalb des zulässigen Wertebereichs. Der Wert wird auf den nächstgelegenen Endpunkt des Bereichs gesetzt.
Zuweisen eines Werts wie '10.34 a'
zu
einer numerischen Spalte. Der nichtnumerische Text am Ende
wird entfernt, und der verbleibende numerische Teil wird
eingefügt. Hat der String-Wert am Anfang keinen numerischen
Teil, dann wird die Spalte auf 0
gesetzt.
Einfügen eines Strings in eine String-Spalte
(CHAR
, VARCHAR
,
TEXT
oder BLOB
), die
die maximale Länge der Spalte überschreitet. Der Wert wird
auf die zulässige Maximallänge der Spalte gekürzt.
Einfügen eines Werts in eine Spalte für Datum oder Uhrzeit, der für diesen Datentyp nicht zulässig ist. Die Spalte wird auf den passenden Nullwert des Typs gesetzt.
Wenn Sie die C-API verwenden, kann der Informations-String durch
Aufruf der Funktion mysql_info()
ermittelt
werden. Siehe auch Abschnitt 24.2.3.34, „mysql_info()
“.
Wenn INSERT
einen Datensatz in eine Tabelle
einfügt, die eine AUTO_INCREMENT
-Spalte
enthält, dann können Sie den Wert dieser Spalte mithilfe der
SQL-Funktion LAST_INSERT_ID()
abfragen. Aus
der C-API heraus verwenden Sie die Funktion
mysql_insert_id()
. Sie sollten allerdings
beachten, dass die beiden Funktionen sich nicht immer identisch
verhalten. Das Verhalten von
INSERT
-Anweisungen in Bezug auf
AUTO_INCREMENT
-Spalten wird in
Abschnitt 12.10.3, „Informationsfunktionen“, und
Abschnitt 24.2.3.36, „mysql_insert_id()
“, ausführlicher beschrieben.
Die INSERT
-Anweisung unterstützt die
folgenden Modifizierer:
Wenn Sie das Schlüsselwort DELAYED
verwenden, legt der Server den oder die einzufügenden
Datensätze in einem Puffer ab, und der Client, der die
INSERT DELAYED
-Anweisung abgesetzt hat,
kann sofort weiterarbeiten. Wird die Tabelle gerade
verwendet, dann hält der Server die Datensätze zurück.
Sobald die Tabelle frei ist, startet der Server mit dem
Einfügen der Datensätze und prüft dabei periodisch, ob
neue Leseanforderungen für die Tabelle anstehen. In diesem
Fall wird die Warteschlange mit den verzögerten
Datensätzen angehalten, bis die Tabelle wieder frei wird.
Siehe auch Abschnitt 13.2.4.2, „INSERT DELAYED
“.
DELAYED
wird bei INSERT ...
SELECT
oder INSERT ... ON DUPLICATE KEY
UPDATE
ignoriert.
Wenn Sie das Schlüsselwort LOW_PRIORITY
angeben, wird die Ausführung von INSERT
verzögert, bis kein Client mehr aus der Tabelle liest. Dies
schließt andere Clients mit ein, die Leseoperationen
starten, während bereits vorhandene Clients aus der Tabelle
lesen und die INSERT
LOW_PRIORITY
-Anweisung wartet. Aus diesem Grund
ist es möglich, dass ein Client, der eine INSERT
LOW_PRIORITY
-Anweisung absetzt, sehr lange warten
muss – in Umgebungen mit extrem hohen Aufkommen von
Leseoperationen sogar für immer. (Dies steht im Gegensatz
zu INSERT DELAYED
, wo der Client direkt
fortfahren kann.) Beachten Sie, dass
LOW_PRIORITY
normalerweise nicht bei
MyISAM
-Tabellen benutzt werden sollte, da
auf diese Weise gleichzeitige Einfügeoperationen unmöglich
gemacht werden. Siehe auch
Abschnitt 7.3.3, „Gleichzeitige Einfügevorgänge“.
Wenn Sie HIGH_PRIORITY
angeben, setzt es
die Auswirkungen der Option
--low-priority-updates
außer Kraft, sofern
der Server mit dieser Option gestartet worden war. Außerdem
sind auch hier gleichzeitige Einfügeoperationen nicht
möglich.
Wenn Sie das Schlüsselwort IGNORE
angeben, werden Fehler, die während der Ausführung der
INSERT
-Anweisung auftreten, als Warnungen
behandelt. So würde beispielsweise ohne
IGNORE
ein Datensatz, der einen
vorhandenen eindeutigen Index oder einen
Primärschlüsselwert in der Tabelle dupliziert, einen
Dublettenfehler verursachen, woraufhin die Anweisung
abgebrochen würde. Bei IGNORE
wird der
Datensatz zwar auch nicht eingefügt, aber es wird kein
Fehler ausgegeben. Bei Fehler auslösenden
Datenkonvertierungen wird die Anweisung abgebrochen, wenn
IGNORE
nicht angegeben ist. Bei
IGNORE
hingegen werden ungültige Werte
auf den jeweils nächstgelegenen gültigen Wert gesetzt und
dann einfügt; außerdem werden Warnungen erzeugt, aber die
Anweisung wird nicht abgebrochen. Mit der C-API-Funktion
mysql_info()
können Sie ermitteln, wie
viele Datensätze tatsächlich in die Tabelle eingefügt
wurden.
Wenn Sie ON DUPLICATE KEY UPDATE
angeben
und ein Datensatz eingefügt wird, der einen doppelten Wert
in einem eindeutigen Index oder einem Primärschlüssel
erzeugen würde, dann wird für den alten Datensatz
UPDATE
ausgeführt. Siehe auch
Abschnitt 13.2.4.3, „INSERT ... ON DUPLICATE KEY UPDATE
“.
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.