# MySQL - Insert mit Duplicate Key Update



## son gohan (18. Juni 2013)

Hallo,

ich habe hier mein MySQL Query und wollte euch fragen wie man das richtig schreiben muss mit dem "ON DUPLICATE KEY UPDATE".

Ich probiere schon seit Tagen immer wieder verschiedene Schreibweisen und bekomme Fehlermeldungen das in der MYSQL Query Syntax was falsch ist.

Das Query wie im folgenden Beispiel macht bei allen Feldern "cl" den gleichen Wert, das will ich aber nicht, ich will eigentlich jedes "cl" Feld mit einem eigenen neuen Wert updaten:


```
$sql = "INSERT INTO `neue`.`perform` (`ticket`, `zeit`, `typ`, `vl`, `on`, `cl`, `tp`, `st`, `gen`, `strg`, `sym`, 

`eaid`) VALUES   ('10350694', '1368717554', '1', '0.05000000', '1.29078000', '1.29205000', '0.00000000', '0.00000000', '4.91', 'strategie1', 'rm', 

('10370265', '1368619737', '2', '0.05000000', '1.28514000', '1.28560000', '0.00000000', '0.00000000', '-1.79', 'strategie1', 'rm', '1')    , 

('10371223', '1368619870', '2', '0.05000000', '1.28512000', '1.28537000', '0.00000000', '0.00000000', '-0.97', 'strategie1', 'rm', '1')    , 

('10371312', '1368619879', '2', '0.05000000', '1.28512000', '1.28532000', '0.00000000', '0.00000000', '-0.78', 'strategie1', 'rm', '1')    , 

('10371328', '1368619885', '2', '0.05000000', '1.28512000', '1.28532000', '0.00000000', '0.00000000', '-0.78', 'strategie1', 'rm', '1')    , 

('10371337', '1368619907', '2', '0.05000000', '1.28514000', '1.28527000', '0.00000000', '0.00000000', '-0.51', 'strategie1', 'rm', '1')    , 

('10384040', '1368629502', '2', '0.05000000', '1.28562000', '1.28588000', '0.00000000', '0.00000000', '-1.01', 'strategie1', 'rm', '1')    , 

('10387013', '1368632765', '2', '0.05000000', '1.28482000', '1.28572000', '0.00000000', '0.00000000', '-3.50', 'strategie1', 'rm', '1')    , 

('11056331', '1370288344', '2', '0.05000000', '1.30738000', '1.30709000', '0.00000000', '0.00000000', '1.11', 'strategie1', 'rm', '1')  ON DUPLICATE  KEY UPDATE cl=(1.29205000)";
```


Ich habe verschiedene Sachen schon probiert, sowas wie das:


```
ON DUPLICATE  KEY UPDATE cl=(1.29205000),(1.39205000),(1.49205000)";
```

oder sowas:


```
ON DUPLICATE  KEY UPDATE cl=VALUES(1.29205000)+VALUES(1.39205000)+VALUES(1.49205000)";
```

oder sowas:


```
ON DUPLICATE  KEY UPDATE cl=(1.29205000,1.39205000,1.49205000)";
```

Das klappt alles nicht.

Jemand hat mir gesagt ich soll dann jeweils einzelne INSERT INTO Querys senden, aber ist das den von der Performance her eine gute Loesung, in mein Beispiel sieht man das ich 9 Datensaetze mit einem Query updaten will, wenn ich jetzt daraus 9 einzelne INSERt INTO Querys mache kostet das doch 9 mal mehr Resourcen oder ?

Also einfach gefragt wie kann ich das am besten machen die vielen Datensaetze zu updaten? In verschiedenen Beitraegen die ich gefunden habe sagen viele das es mit "ON DUPLICATE KEY UPDATE" am besten ist, aber richtige Beispiele oder Loesungen wie das dann aussieht wenn man mehrere Datensaetze gleichzeitig updaten will fand ich noch nicht.


----------



## tombe (18. Juni 2013)

Was passiert wenn du es so versuchst:


```
ON DUPLICATE  KEY UPDATE cl = VALUES(cl)
```

Wenn das oben der tatsächliche Code ist, dann fehlt doch bei den ersten VALUES am Ende eine schließende Klammer oder nicht!?


----------



## Yaslaw (18. Juni 2013)

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


> ```
> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
> ```



Das heisst für dich

```
ON DUPLICATE  KEY UPDATE cl=VALUES(cl)
```


----------



## son gohan (18. Juni 2013)

tombe hat gesagt.:


> Was passiert wenn du es so versuchst:
> 
> 
> ```
> ...



Danke dir, ich glaube das ist die Loesung gewesen, ich bekomme so keine Fehlermeldung.

Ich glaube ich habe die ganze Zeit diesen Query Aufbau mit DUPLICATE KEY nicht verstanden, im Prinzip stehen ja die neuen Werte fuer das Feld "cl" schon im INSERT Query Teil und wenn man dann bei UPDATE schreibt so wie in deinem Beispiel klappt das dann.

Und ich habe vorher die ganze Zeit versucht die neuen Werte nochmal zu schreiben und an den DUPLICATE Teil dran zu haengen.


----------

