MySQL ON DUPLICATE KEY UPDATE für mehrere Zeilen in eine einzelne Abfrage einfügen


199

Ich habe eine SQL-Abfrage, bei der ich mehrere Zeilen in eine einzelne Abfrage einfügen möchte. Also habe ich so etwas benutzt wie:

$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ühre, möchte ich prüfen, ob ein UNIQUESchlüssel (der nicht der ist PRIMARY KEY), z. B. 'name'oben, überprüft werden soll, und wenn ein solcher 'name'bereits vorhanden ist, sollte die entsprechende ganze Zeile aktualisiert werden, andernfalls eingefügt.

Wenn im folgenden Beispiel beispielsweise 'Katrina'bereits in der Datenbank vorhanden ist, sollte die gesamte Zeile unabhängig von der Anzahl der Felder aktualisiert werden. Wenn dies 'Samia'nicht der Fall ist, sollte die Zeile erneut eingefügt werden.

Ich dachte an:

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 darüber, wie ich vorgehen sollte. Ich muss mehrere Zeilen gleichzeitig einfügen / aktualisieren. Bitte geben Sie mir eine Richtung. Vielen Dank.

Antworten:


479

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

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

2
Was ist, wenn wir eine IF-Anweisung in das UPDATE aufnehmen müssen, die für jede Zeile eine andere Bedingung hat?
Logik

2
@logic: Hierzu gibt es mehrere Fragen: StackOverflow-Suche . Wenn keiner von ihnen Ihre Frage beantwortet, veröffentlichen Sie bitte eine neue, in der genau erklärt wird, was Sie benötigen.
Peter Lang

@logic Sie haben eine Lösung für Ihr Problem gefunden? Derzeit stehe ich vor dem gleichen Problem
Parth Kharecha

Toller Vorschlag. Wenn Sie einen Wert beim Duplizieren erhöhen möchten, fügen Sie diesen nach dem Teil "ON DUPLICATE KEY UPDATE" hinzu: total = total + VALUES (total)
Phoenix

1

INSERT INTO ... ON DUPLICATE KEY UPDATE funktioniert nur für MYSQL, nicht für SQL Server.

Für SQL Server können Sie dies umgehen, indem Sie zuerst eine temporäre Tabelle deklarieren, einen Wert in diese temporäre Tabelle einfügen und dann MERGE verwenden

So was:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);

15
Wer verwendet SQL Server obwohl: D
Jeremy Belolo

-3

Sie können Ersetzen anstelle von EINFÜGEN ... ON DUPLICATE KEY UPDATE verwenden.


28
Ja, aber mit REPLACE wird die alte Zeile gelöscht, bevor die neue Zeile eingefügt wird. Ich möchte die alte Zeile für die Verwaltung der primären IDs beibehalten.
Prashant

2
Ich wusste nicht, dass es irgendwie wichtig für Sie ist, die alte PK beizubehalten ... Sicherlich funktioniert REPLACE in diesem Fall nicht ...
a1ex07

4
PS: "Ersetzen in" erfordert sowohl Lösch- als auch Einfügeberechtigungen!
Oliver M Grech

2
und aus den oben genannten Gründen zum Löschen / Einfügen ist es in diesen Fällen auch viel langsamer.
Ross

1
Was ist, wenn Sie einige Spalten aktualisieren möchten? Ersetzen aktualisiert alle.
IMVJ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.