# On duplicate Key update



## 1337iceskater (7. Apr 2011)

Hallo Leute,

ich habe ein (wenn auch nicht ganz Java-spezifisches) Problem. Folgendes:

Ich will auf meinem Android-Phone für ne Studienarbeit die lokale SQLite mit ner MySQL auf nem Server synchronisieren. Dafür schreib ich mir selber was (das ist auch der Inhalt der Arbeit) und stehe nun bei einem kleinen Problem. Ich sende die Querys an die MySQL an ein php-Skript und führe das direkt auf dem Server aus. Da das immer recht lange dauert, versuche ich die Abfragen so allgemein wie möglich zu formulieren. Ich habe dabei eine Abfrage gefunden, die wie folgt aussieht:

INSERT INTO person (id,nummer,name,version) 
VALUES ('1','123456','Horst','1') 
ON DUPLICATE KEY UPDATE 
id=VALUES(id),nummer=VALUES(nummer),name=VALUES(name),version=VALUES(version)

Ich würde jetzt, da ich ne eigene Versionierung habe, gerne im Update-Teil nochmal die Versionen vergleichen. Habe dabei an ne Art IF oder WHERE gedacht. Ich weiß aber nicht, wie ich das da rein packen soll. Habt ihr da ne Idee?

Vielen Dank schonmal.

LG


----------



## 1337iceskater (7. Apr 2011)

Ich habe jetzt eine Idee gefunden, die eigentlich funktionieren sollte:

ON DUPLICATE KEY UPDATE val=CASE version WHEN version>VALUES(version) THEN val ELSE VALUES(val) END

Wo liegt dabei der Fehler? 

Danke nochmal


----------



## r.w. (9. Apr 2011)

Hallo 1337iceskater,



1337iceskater hat gesagt.:


> Ich habe jetzt eine Idee gefunden, die eigentlich funktionieren sollte:
> 
> ON DUPLICATE KEY UPDATE val=CASE version WHEN version>VALUES(version) THEN val ELSE VALUES(val) END
> 
> ...



so sollte das klappen:


```
INSERT INTO person(id,nummer,name,version)
VALUES( 1, '456789', 'Walter', 3)
ON DUPLICATE KEY UPDATE
nummer =
CASE WHEN  version < VALUES(version) THEN 
   VALUES(nummer)
ELSE 
   nummer
END,
name =
CASE WHEN  version < VALUES(version) THEN 
   VALUES(name)
ELSE 
   name
END,
version = 
CASE WHEN  version < VALUES(version) THEN 
   VALUES(version) 
ELSE 
   version
END
```

Ich hoffe, das hilft Dir weiter.

VG ROlf


----------



## 1337iceskater (9. Apr 2011)

Vielen Dank Rolf,

hab den Fehler gefunden. Die korrekte Synthax der Case-Anweisung ist tatsächlich:

CASE WHEN bedingung THEN wert1 ELSE wert2 END

und nicht wie ich hatte:

CASE zu_vergleichender_wert WHEN bedingung THEN wert1 ELSE wert2 END

Mit der richtigen Synthax funzt es auch =)

Danke nochmal.


----------

