Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So fügen Sie in MySQL ein, wenn eine Zeile nicht existiert (UPSERT).

  • 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 normales INSERT 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.