RDBMS hat viele Tücken! Manchmal, wenn man nicht dran denkt, kann man so gut und gern mal einen Tag verschwenden…
Diese Erfahrung habe ich soeben wieder mal machen dürfen. Der einfache und nützliche Befehl ON DUBLICATE KEY UPDATE wollte ich verwenden, um Datensätze in meiner Datenbank zu aktualisieren, falls sich beim Schreiben mit INSERT herausstellen sollte, das schon ein solcher Vorhanden ist.
"INSERT INTO hosts(ip, hostname, date, OS) VALUES('ip', 'hostname', 'date', 'OS') ON DUPLICATE KEY UPDATE hosts SET date = 'date' WHERE hostname = 'hostname' AND ip = 'ip'";
Alles schön und gut hab ich mir gedacht und mein Code mal getestet. Doch in die Datenbank wurde weder etwas geschrieben, noch ein Datensatz aktualisiert.
Auf der Suche nach der Antwort für mein für mich unverständliches Problem, habe ich von diversen Seiten bestätigt bekommen, dass mein SQL-Querry so eigentlich funktionieren sollte.
Eigentlich war ich kurz vor dem Verzweifeln, bis ich einen Tipp bekam. Dieser war kurz und einfach: RDBMS
Wie sich herausstellte, und woran ich beim Programmieren auch nicht gedacht habe ist, dass ON DUBLICATE KEY UPDATE nur für MySQL-dB’s funktioniert, nicht aber für M$SQL, welche ich verwende…
Damit mein Vorhaben auch unter einem Microsoft-Produkt funktioniert brauche ich einen andern SQL-String:
IF (EXISTS (SELECT * FROM hosts WHERE ip= 'xyz')) begin UPDATE hosts SET date = now() WHERE ip= 'xyz' end else begin INSERT INTO hosts(ip, date) VALUES('zzz', now()) end
Es läuft nun astrein mit der Ausnahme, dass der SQL String für M$SQL einfach 5 Mal so lang und 10 Mal so kompliziert… Aber die Effektivität von Microsoft ist ein anderes Thema