INSERT INTO .. ​​ON DUPLICATE KEY UPDATE für mehrere Elemente

70

Ich möchte so etwas tun

INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key2','value') 
ON DUPLICATE KEY UPDATE 
t.c = 'value';
INSERT INTO t (t.a, t.b, t.c) 
VALUES ('key1','key3','value2') 
ON DUPLICATE KEY UPDATE 
t.c = 'value2';

ta und tb sind Schlüssel. Das alles funktioniert gut, aber ich bekomme eine Fehlermeldung beim zweiten Einsatz. Mit phpMyAdmin funktioniert eine solche Abfrage einwandfrei, aber ich vermute, sie führt die Abfragen unabhängig aus, während die Ergebnisse dieser Abfrage als Kommentare ausgedruckt werden.

So etwas wäre auch gut, aber ich muss für jeden Artikel unterschiedliche Werte haben. Ich bevorzuge dies, aber ich bin nicht sicher, wie ich den Wert auf dem Update für jeden Wert ändern kann.

INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = ???

Das Problem ist in den Fragezeichen, was soll ich dort setzen, damit jede Einfügung / Aktualisierung den richtigen Wert hat? Wenn ich dort einen Wert eingebe, erhalten natürlich alle Felder diesen Wert.

Wenn es eine andere Möglichkeit gibt, eine Abfrage "Aktualisieren, falls vorhanden, andernfalls einfügen" für mehrere Felder mit zwei Schlüsseln durchzuführen, bin ich auch für andere Ideen bereit. Ich denke, ich könnte jede Abfrage einzeln ausführen (wie phpMyAdmin?), Aber es wird eine Menge Abfragen geben, also möchte ich das wirklich vermeiden.

Antti
quelle

Antworten:

160

Verwenden Sie die Funktion VALUES ()

INSERT INTO t (t.a, t.b, t.c)
VALUES ('key1','key2','value'), ('key1','key3','value2')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c)

Siehe http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

ʞɔıu
quelle
2
mysql> INSERT INTO param (id, num) VALUES (3,4) ON DUPLICATE KEY UPDATE id = VALUES (d) +222; Abfrage OK, 2 Zeilen betroffen (0,67 Sek.)
Zloctb
41

Zu wenig Repräsentation für einen Kommentar, aber ich wollte eine etwas komplexere Syntax hinzufügen, die von der @ ʞɔıu-Antwort inspiriert wurde. So aktualisieren Sie mehrere Felder bei doppeltem Schlüssel:

INSERT INTO t (t.a, t.b, t.c, t.d)
VALUES ('key1','key2','value','valueb'), ('key1','key3','value2','value2b')
ON DUPLICATE KEY UPDATE
t.c = VALUES(t.c),
t.d = VALUES(t.d)

Ich hoffe, das hilft jemandem da draußen, der eine Masseneinfügung mit mehreren Aktualisierungen bei doppeltem Schlüssel durchführen möchte. Die Syntax ist mir entgangen.

Marc
quelle
0

Nach MySQL 8.0.19 können Sie asbeispielsweise Schlüsselwörter verwenden:

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
  ON DUPLICATE KEY UPDATE c = new.a+new.b;

oder

INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
  ON DUPLICATE KEY UPDATE c = m+n;

ref: https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

Hunger
quelle