2010-04-26 6 views
144

Ich habe eine SQL-Abfrage, wo ich mehrere Zeilen in einzelne Abfrage einfügen möchten. so habe ich so etwas wie:MySQL ON DUPLICATE KEY UPDATE für mehrere Zeilen einfügen in einzelne Abfrage

$sql = "INSERT INTO beautiful (name, age) 
    VALUES 
    ('Helen', 24), 
    ('Katrina', 21), 
    ('Samia', 22), 
    ('Hui Ling', 25), 
    ('Yumie', 29)"; 

mysql_query($sql, $conn); 

Das Problem ist, wenn ich diese Abfrage ausführen, ich, ob ein eindeutiger Schlüssel überprüfen möchten (was nicht der Primärschlüssel ist), zum Beispiel. 'name' im obigen Fall, sollte überprüft werden und wenn ein solcher 'Name' bereits existiert, sollte die entsprechende ganze Zeile aktualisiert werden sonst eingefügt.

Zum Beispiel, in unten, zB wenn 'Katrina' bereits in der Datenbank vorhanden ist, sollte die ganze Zeile, unabhängig von der Anzahl der Felder, aktualisiert werden. Wenn 'Samia' nicht vorhanden ist, sollte die Zeile eingefügt werden.

ich daran gedacht, mit:

INSERT INTO beautiful (name, age) 
     VALUES 
     ('Helen', 24), 
     ('Katrina', 21), 
     ('Samia', 22), 
     ('Hui Ling', 25), 
     ('Yumie', 29) ON DUPLICATE KEY UPDATE 

Hier ist die Falle. Ich blieb stecken und war verwirrt, wie es weitergehen sollte. Ich habe mehrere Zeilen zum Einfügen/Aktualisieren zu einem Zeitpunkt. Bitte gib mir die Richtung. Vielen Dank.

Antwort

338

Verwenden Sie das Schlüsselwort VALUES, um auf neue Werte zu verweisen (siehe documentation).

INSERT INTO beautiful (name, age) 
    VALUES 
    ('Helen', 24), 
    ('Katrina', 21), 
    ('Samia', 22), 
    ('Hui Ling', 25), 
    ('Yumie', 29) 
ON DUPLICATE KEY UPDATE 
    age = VALUES(age), 
    ... 
+6

Danke eine Tonne. Das ist genau das, was ich will .... Danke nochmal ... – Prashant

+10

** schön **, genau was ich brauchte. * heh, was ich dort gemacht habe? * –

+0

Was ist, wenn wir eine IF-Anweisung in das UPDATE einfügen müssen, die für jede Zeile eine andere Bedingung hat? – logic

-1

Sie können Replace anstelle von INSERT ... ON DUPLICATE KEY UPDATE verwenden.

+16

Ja, aber mit REPLACE wird die alte Zeile gelöscht, bevor die neue Zeile eingefügt wird. Ich möchte die alte Zeile beibehalten, um primäre IDs zu erhalten. – Prashant

+2

Ich habe nicht bemerkt, dass das Zurückhalten des alten PK irgendwie wichtig für dich ist ... Sicherlich wird REPLACE in diesem Fall nicht funktionieren ... – a1ex07

+0

Wenn PK dir egal ist, wie in meinem Fall, funktioniert das perfekt. – MLeFevre

Verwandte Themen