Bei doppelter Schlüsselaktualisierung – mehrere Spalten

Lesezeit: 5 Minuten

Benutzer-Avatar
Lucy Weatherford

Beim Benutzen Einfügen… bei doppelter Schlüsselaktualisierungwie lautet die Syntax zum Aktualisieren mehrerer Spalten?

INSERT INTO table1 (col1, col2, col3, col4) VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’)
ON DUPLICATE KEY UPDATE col2=‘$val2’, col3=‘$val3’, col4=‘$val4’ // <-- not sure

Update: Ich verwende dies in PHP. Da dies eine Syntaxfrage ist, ist sie sehr relevant.

$result = mysql_query("INSERT INTO table1 (col1, col2, col3, col4) 
                         VALUES (’$val1’, ‘$val2’, ‘$val3’, ‘$val4’)
                         ON DUPLICATE KEY UPDATE (col2=‘$val2’, col3=‘$val3’, col4=‘$val4’)")

Wieder nicht sicher über diesen letzten Teil mit dem “Update”.

Benutzer-Avatar
Wrikken

Nun, das ist alt. Aber natürlich müssen Sie nur einen Wert angeben einmalgibt es keinen Grund, es ein zweites Mal in die Abfrage einzufügen (was praktisch für mehrere Einfügungen oder vorbereitete Anweisungen ist):

INSERT INTO table1
  (col1, col2, col3, col4)
VALUES
  ('val1', 'val2', 'val3', 'val4')
ON DUPLICATE KEY UPDATE
  col2=VALUES(col2),
  col3=VALUES(col3) [,...]

Was den Vorteil hat, dass es immer noch für eine mehrfache Einfügeanweisung funktioniert:

INSERT INTO table1
  (col1, col2, col3, col4)
VALUES
  ('val1', 'val2', 'val3', 'val4'),
  ('val5', 'val6', 'val7', 'val8'),
  ('val9', 'val10', 'val11', 'val12')
ON DUPLICATE KEY UPDATE
  col2=VALUES(col2),
  col3=VALUES(col3) [,...]

Ein modernes PHP-Beispiel:

$sql = "INSERT INTO table1 (col1, col2, col3, col4) VALUES (?,?,?,?)
        ON DUPLICATE KEY UPDATE
        col2=VALUES(col2),
        col3=VALUES(col3),
        col4=VALUES(col4)";
$db->prepare($sql)->execute([$val1, $val2, $val3, $val4]);

  • Dies ist die beste Antwort. Verwenden Sie einfach die Funktionalität von MySQL, die mehrere Einfügungen unterstützt

    – Ali Alwash

    17. Januar 2018 um 15:27 Uhr

  • Ohne ein Komma danach geht das nicht col2=VALUES(col2).

    – würdig

    12. April 2018 um 13:21 Uhr

  • @wortwart Behoben 🙂

    – 472084

    29. August 2018 um 7:39 Uhr

  • Dies sollte ganz oben sein. Kurz, prägnant und anhand von Beispielen leicht verständlich. Wusste bis jetzt nicht einmal, dass wir Werte nach Spalten-/Feldnamen referenzieren können.

    – Chris

    1. März 2020 um 20:45 Uhr

Benutzer-Avatar
sathia

INSERT INTO table1
  (`col1`, `col2`, `col3`, `col4`)
VALUES
  ('val1', 'val2', 'val3', 'val4')
ON DUPLICATE KEY UPDATE
  `col2`='val2',
  `col3`='val3', [...]

Ich habe Ihre Anführungszeichen und Markierungen korrigiert.

  • Siehe mein Update, das ist innerhalb des PHP-Skripts, daher die Syntax. Ich würde mich freuen, wenn Sie jetzt einen Blick darauf werfen könnten. Danke

    – Lucy Weatherford

    24. Januar 2012 um 18:26 Uhr

  • Sie können keine Teilstriche für Werte verwenden, diese sind für die Verwendung mit Spaltennamen gedacht. Verwenden Sie die Syntax, die ich in meiner Antwort gezeigt habe. es wird klappen.

    – sathia

    24. Januar 2012 um 22:46 Uhr

  • $result = mysql_query(“INSERT INTO table1 (‘col1’, ‘col2’, ‘col3’, ‘col4’) VALUES (“.$val1.”, “.$val2.”, “.$val3.”, ” .$val4.”) BEI DUPLICATE KEY UPDATE ‘col2’=”.$val2.”, ‘col3’=”.$val3.”, ‘col4’=”.$val4.”)

    – sathia

    24. Januar 2012 um 22:50 Uhr

  • das funktioniert nicht 🙁 Ich weiß, dass ich vorher KEINE Häkchen oder Anführungszeichen für die Spaltennamen verwenden musste

    – Lucy Weatherford

    24. Januar 2012 um 23:03 Uhr

  • Wie wäre es mit pdo::quote()?

    – Philipp Haglund

    2. Juni 2013 um 12:42 Uhr

Benutzer-Avatar
Asega

INSERT INTO tb (name, date, stat1, stat2, stat3) 
VALUES (?, ?, ?, ?, ?) 
ON DUPLICATE KEY UPDATE stat1 = stat1 + VALUES(stat1),
                        stat2 = stat2 + VALUES(stat2), 
                        stat3 = stat3 + VALUES(stat3)

Benutzer-Avatar
sbrbot

Der übersichtlichen Syntax wegen gibt es noch eine andere Syntaxform;

INSERT INTO `table1` SET `id`=$id,
                         `col2`='$col2',
                         `col3`='$col3'[, ...]
 ON DUPLICATE KEY UPDATE `col2`='$col2',
                         `col4`='$col4'[, ...]

Beispiel;

INSERT INTO customers SET cid=10,
                          createdon=NOW(),
                          createdby='user',
                          cname="Steve"
  ON DUPLICATE KEY UPDATE modifiedon=NOW(),
                          modifiedby='user',
                          cname="Steve";

Wenn es keinen Kunden mit ID=10 in der Datenbank gibt, wird er erstellt und die Spalten cid, createdon, createdby, cname werden gesetzt. Wenn es existiert, wird es aktualisiert und die Spalten modifyon, modifydbym, cname werden aktualisiert.

ANMERKUNG 1: WENN Sie hier für den Primärschlüssel cid=0 eingeben, wird AUTO_INCREMENT ausgelöst (natürlich, wenn die pk-Spalte als AUTO_INCREMENT definiert ist) und ein Datensatz wird eingefügt!

ANMERKUNG 2: ON DUPLICATE KEY UPDATE aktualisiert den vorhandenen PK-ID-Eintrag. Es wird aber auch aktualisiert, wenn DUPLICATE für eine UNIQUE KEY-Spalte erstellt wird. Wenn Sie beispielsweise definiert haben, dass die cname-Spalte EINZIGARTIG ist, führt das Speichern eines bereits vorhandenen Datensatzes mit cname=”Steve” zu einem UPDATE dieses Datensatzes (nicht zu einem neuen INSERT). Achten Sie darauf, da Sie erwarten können, dass DB einen Fehler für die Verletzung der UNIQUE KEY-Einschränkung zurückgibt, was hier nicht passieren wird.

Deine Anfrage scheint richtig zu sein. Hier ist mein Beispiel für diese Art von Abfrage:

INSERT INTO Stat (id, month, year, views, redirects, onList, onMap, emails) VALUE ("' . $Id . '","' . $month . '","' . $year . '",0,0,"' . $data['onList'] . '","' . $data['onMap'] . '",0) ON DUPLICATE KEY UPDATE onList=onList+' . $data['onList'] . ', onMap=onMap+' . $data['onMap']

  • warum ist das zweite onList notwendig hinein onList=onList+'.$data['onList'].? ist es nicht genug zu haben onList=$data['onList']? oder in meinem Beispiel: col2='$val2'?

    – Lucy Weatherford

    24. Januar 2012 um 22:38 Uhr


  • Was er tut, ist etwas anders, er fügt $data hinzu[‘onList’] zum onList-Feldwert.

    – sathia

    24. Januar 2012 um 22:46 Uhr

  • warum ist das zweite onList notwendig hinein onList=onList+'.$data['onList'].? ist es nicht genug zu haben onList=$data['onList']? oder in meinem Beispiel: col2='$val2'?

    – Lucy Weatherford

    24. Januar 2012 um 22:38 Uhr


  • Was er tut, ist etwas anders, er fügt $data hinzu[‘onList’] zum onList-Feldwert.

    – sathia

    24. Januar 2012 um 22:46 Uhr

1179600cookie-checkBei doppelter Schlüsselaktualisierung – mehrere Spalten

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy