REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
[(col_name
,...)] VALUES ({expr
| DEFAULT},...),(...),...
Oder:
REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
SETcol_name
={expr
| DEFAULT}, ...
Oder:
REPLACE [LOW_PRIORITY | DELAYED] [INTO]tbl_name
[(col_name
,...)] SELECT ...
REPLACE
funktioniert auf exakt gleiche Weise
wie INSERT
. Der Unterschied besteht darin,
dass, wenn ein alter Datensatz denselben Wert wie ein neuer
Datensatz für einen Primärschlüssel oder einen eindeutigen
Index hat, der alte Datensatz gelöscht wird, bevor der neue
eingefügt wird. Siehe auch Abschnitt 13.2.4, „INSERT
“.
REPLACE
ist eine MySQL-Erweiterung zum
SQL-Standard. Es kann Datensätze einfügen, oder es kann
Datensätze löschen und einfügen. Wenn
Sie eine Anweisung suchen, die dem SQL-Standard entspricht und
die entweder einfügt oder aktualisiert,
dann benutzen Sie die INSERT ... ON DUPLICATE KEY
UPDATE
-Anweisung (siehe auch
Abschnitt 13.2.4.3, „INSERT ... ON DUPLICATE KEY UPDATE
“).
Beachten Sie, dass, sofern die Tabelle nicht einen
Primärschlüssel oder einen eindeutigen Index hat, die
Verwendung von REPLACE
unsinnig ist. Die
Anweisung wäre dann mit INSERT
identisch,
weil kein Index vorhanden ist, anhand dessen bestimmt werden
könnte, ob ein neuer Datensatz ein Duplikat eines bereits
vorhandenen darstellt.
Werte für alle Spalten werden den Werten entnommen, die in der
REPLACE
-Anweisung angegeben sind. Fehlende
Spalten werden – wie bei INSERT
– auf
ihre Standardwerte gesetzt. Es ist nicht möglich, Werte aus dem
aktuellen Datensatz zu referenzieren und diese dann im neuen
Datensatz zu verwenden. Wenn Sie eine Zuordnung wie SET
verwenden,
wird die Referenzierung des Spaltennamens auf der rechten Seite
wie
col_name
=
col_name
+ 1DEFAULT(
behandelt, d. h., die Zuordnung ist äquivalent zu col_name
)SET
.
col_name
=
DEFAULT(col_name
) + 1
Um REPLACE
zu verwenden, benötigen Sie die
Berechtigungen INSERT
und
DELETE
für die Tabelle.
Die REPLACE
-Anweisung gibt einen Wert
zurück, der die Anzahl der betroffenen Datensätze angibt.
Konkret ist dies die Summe der gelöschten und eingefügten
Datensätze. Wenn der Wert bei einer
REPLACE
-Anweisung für einen Datensatz 1
beträgt, dann wurde ein Datensatz eingefügt und keiner
gelöscht. Ist der Wert größer als 1, dann wurden ein oder
mehrere alte Datensätze gelöscht, bevor der neue Datensatz
eingefügt wurde. Ein einzelner Datensatz kann durchaus mehr als
nur einen alten Datensatz ersetzen, sofern die Tabelle mehrere
eindeutige Indizes hat und der neue Datensatz Werte
verschiedener alter Datensätze in verschiedenen eindeutigen
Indizes dupliziert.
Die Anzahl der betroffenen Datensätze erlaubt also die einfache
Bestimmung, ob REPLACE
nur einen Datensatz
hinzugefügt hat oder ob auch Datensätze ersetzt wurden:
Überprüfen Sie, ob der Wert 1 (Hinzufügung) oder größer ist
(Ersetzung).
Wenn Sie die C-API verwenden, kann die Anzahl der betroffenen
Datensätze durch die Funktion
mysql_affected_rows()
ermittelt werden.
Zurzeit können Sie in einer Unterabfrage keine Ersetzungsoperation in einer Tabelle durchführen und gleichzeitig eine Auswahl in einer anderen Tabelle treffen.
MySQL verwendet für REPLACE
(und
LOAD DATA ... REPLACE
) den folgenden
Algorithmus:
Es wird versucht, den neuen Datensatz in die Tabelle einzufügen.
Wenn die Einfügeoperation aufgrund einer Schlüsseldublette in einem Primärschlüssel oder einem eindeutigen Index fehlschlägt,
wird der konfliktauslösende Datensatz mit dem doppelten Schlüsselwert aus der Tabelle entfernt,
wird erneut versucht, den neuen Datensatz in die Tabelle einzufügen.
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.