it-swarm.com.de

INSERT IN .. ON DUPLICATE KEY UPDATE für mehrere Elemente

Ich möchte so etwas machen

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';

t.a und t.b sind Schlüssel. Dies alles funktioniert gut, aber ich bekomme einen Fehler auf dem zweiten Einsatz. Mit phpMyAdmin funktioniert eine solche Abfrage einwandfrei, aber ich vermute, sie führt die Abfragen unabhängig voneinander aus, da sie die Ergebnisse dieser Abfrage als Kommentare ausgibt.

So etwas wäre auch gut, aber ich brauche unterschiedliche Werte für jeden Artikel. 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 korrekten Wert hat? Offensichtlich, wenn ich einen Wert dort setze, erhalten alle Felder diesen Wert.

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

67
Antti

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

150
ʞɔıu

Zu wenig Repräsentanten für einen Kommentar, aber ich wollte eine etwas komplexere Syntax hinzufügen, die von der @ ʞɔıu-Antwort inspiriert war. So aktualisieren Sie mehrere Felder eines doppelten Schlüssels:

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)

Hoffe, dass jemand da draußen hilft, der Bulk-Insert mit mehreren Updates auf doppelten Schlüsseln durchführen möchte. Die Syntax ist mir entgangen.

37
Marc