[+/-]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
Oder:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
SET col_name={expr | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
Oder:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name [(col_name,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE col_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.
