- Mit
INSERT IGNORE
- Mit
REPLACE
- Verwendung von
INSERT ... ON DUPLICATE KEY UPDATE
MySQL bietet eine Reihe nützlicher Anweisungen, wenn INSERT
erforderlich ist Zeilen nach Bestimmen, ob diese Zeile tatsächlich neu ist oder bereits vorhanden ist.
Im Folgenden untersuchen wir die drei verschiedenen Methoden und erklären der Reihe nach die Vor- und Nachteile, damit Sie genau wissen, wie Sie Ihre eigenen Anweisungen konfigurieren, wenn Sie neue oder potenziell vorhandene Daten für INSERTION
bereitstellen .
Mit INSERT IGNORE
Mit INSERT IGNORE
bewirkt effektiv, dass MySQL ignoriert wird Ausführungsfehler beim Versuch, INSERT
auszuführen Aussagen. Das bedeutet, dass ein INSERT IGNORE
Anweisung, die einen doppelten Wert in einem UNIQUE
enthält Index oder PRIMARY KEY
Feld nicht erzeugt einen Fehler, sondern ignoriert stattdessen einfach diesen bestimmten INSERT
ganz befehlen. Der offensichtliche Zweck besteht darin, eine große Anzahl von INSERT
auszuführen Anweisungen für eine Kombination von Daten, die sowohl bereits in der Datenbank vorhanden sind, als auch neue Daten, die in das System kommen.
Zum Beispiel unsere books
Die Tabelle enthält möglicherweise bereits einige Datensätze:
mysql> SELECT * FROM books LIMIT 3;
+----+-------------------------+---------------------+----------------+
| id | title | author | year_published |
+----+-------------------------+---------------------+----------------+
| 1 | In Search of Lost Time | Marcel Proust | 1913 |
| 2 | Ulysses | James Joyce | 1922 |
| 3 | Don Quixote | Miguel de Cervantes | 1605 |
+----+-------------------------+---------------------+----------------+
3 rows in set (0.00 sec)
Wenn wir eine große Menge neuer und bestehender Daten haben, INSERT
und ein Teil dieser Daten enthält einen übereinstimmenden Wert für id
Feld (das ein UNIQUE
ist PRIMARY_KEY
in der Tabelle), mit einem einfachen INSERT
erzeugt einen erwarteten Fehler:
mysql> INSERT INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
Auf der anderen Seite, wenn wir INSERT IGNORE
verwenden , der Duplizierungsversuch wird ignoriert und es treten keine resultierenden Fehler auf:
mysql> INSERT IGNORE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 0 rows affected (0.00 sec)
Mit REPLACE
Für den Fall, dass Sie tatsächlich ersetzen möchten Zeilen, in denen INSERT
Befehle würden aufgrund von doppeltem UNIQUE
Fehler erzeugen oder PRIMARY KEY
Werte wie oben beschrieben, besteht eine Option darin, sich für REPLACE
zu entscheiden Aussage.
Beim Ausgeben eines REPLACE
-Anweisung gibt es zwei mögliche Ergebnisse für jeden ausgegebenen Befehl:
- Es wird keine vorhandene Datenzeile mit übereinstimmenden Werten gefunden und daher ein Standard-
INSERT
Anweisung durchgeführt wird. - Eine übereinstimmende Datenzeile ist gefunden, wodurch diese vorhandene Zeile mit dem Standard
DELETE
gelöscht wird -Anweisung, dann ein normalesINSERT
wird danach durchgeführt.
Zum Beispiel können wir REPLACE
verwenden um unseren bestehenden Datensatz von id = 1
auszutauschen von Auf der Suche nach der verlorenen Zeit von Marcel Proust mit Grünen Eiern und Schinken von Dr. Seuss:
mysql> REPLACE INTO books
(id, title, author, year_published)
VALUES
(1, 'Green Eggs and Ham', 'Dr. Seuss', 1960);
Query OK, 2 rows affected (0.00 sec)
Beachten Sie, dass, obwohl wir nur eine Zeile geändert haben, das Ergebnis zwei anzeigt Zeilen waren betroffen, weil wir tatsächlich DELETED
die vorhandene Zeile dann INSERTED
die neue Zeile, um sie zu ersetzen.
Weitere Informationen zur Verwendung von REPLACE
finden Sie in der offiziellen Dokumentation.
Verwendung von INSERT ... ON DUPLICATE KEY UPDATE
Die alternative (und allgemein bevorzugte) Methode für INSERTING
in Zeilen, die doppelten UNIQUE
enthalten können oder PRIMARY KEY
Werten ist die Verwendung des INSERT ... ON DUPLICATE KEY UPDATE
Anweisung und Klausel.
Im Gegensatz zu REPLACE
– ein von Natur aus destruktiver Befehl aufgrund des DELETE
Befehle, die es bei Bedarf ausführt – mit INSERT ... ON DUPLICATE KEY UPDATE
ist zerstörungsfrei , indem es immer nur INSERT
ausgibt oder UPDATE
Anweisungen, aber niemals DELETE
.
Beispielsweise haben wir entschieden, dass wir unsere id = 1
ersetzen möchten Aufzeichnung von Grünen Eiern und Schinken und es wieder auf das Original Auf der Suche nach der verlorenen Zeit zurücksetzen stattdessen aufzeichnen. Wir können daher unser ursprüngliches INSERT
nehmen -Anweisung und fügen Sie den neuen ON DUPLICATE KEY UPDATE
hinzu Klausel:
mysql> SET @id = 1,
@title = 'In Search of Lost Time',
@author = 'Marcel Proust',
@year_published = 1913;
INSERT INTO books
(id, title, author, year_published)
VALUES
(@id, @title, @author, @year_published)
ON DUPLICATE KEY UPDATE
title = @title,
author = @author,
year_published = @year_published;
Beachten Sie, dass wir das normale UPDATE
verwenden Syntax (aber ohne die unnötige table
name und SET
Schlüsselwort) und nur den non-UNIQUE
zuweisen Werte. Auch, obwohl unnötig für ON DUPLICATE KEY UPDATE
Damit die Methode richtig funktioniert, haben wir uns auch für die Verwendung von user variables
entschieden Wir müssen also nicht die tatsächlichen Werte angeben, die wir INSERT
möchten oder UPDATE
mehr als einmal.
Als Ergebnis ist unsere id = 1
Datensatz wurde ordnungsgemäß UPDATED
wie erwartet:
mysql> SELECT * FROM books LIMIT 1;
+----+------------------------+---------------+----------------+
| id | title | author | year_published |
+----+------------------------+---------------+----------------+
| 1 | In Search of Lost Time | Marcel Proust | 1913 |
+----+------------------------+---------------+----------------+
1 row in set (0.00 sec)
Weitere Informationen finden Sie in der offiziellen Dokumentation.