Ein üblicher Prozess beim Programmieren mit Relationalen Datenbanken (in diesem Fall MySQL) und besonders im Web ist das „wenn vorhanden, update, wenn nicht vorhanden insert“ Konstrukt was man in vielen Anwendungen sieht. Auch in meinen Scripten gibt es diese Abfragen und es hat mich schon immer gestört, da man recht viel Code für eine simple Sache braucht. Glücklicherweise gibt es Abhilfe zu diesem Problem, wenn man Primär oder Unique Keys benutzt einfügen/updaten will.
MySQL Replace Into
Eine simple Lösung, die ich eine Zeit lang benutzt habe, ist das REPLACE INTO Statement. Dieses funktioniert wie ein normales INSERT und die Syntax ist ebenfalls ähnlich. Der Unterschied ist das wenn im Statement ein Primärschlüssel angegeben wird, der schon in der Tabelle vorhanden ist, dann wird kein Fehler zurück gegeben, sondern die Zeile gelöscht und die angegebene neue Zeile eingefügt. MySQL macht also intern einen Insert. Wenn dieser einen Fehler wegen doppeltem Key (Primär/Unique) erzeugt, wird die alte Zeile gelöscht (Delete) und dann wird der Insert erneut ausgeführt. Das funktioniert sehr gut bei kleinen Tabellen. Das Problem bei diesem Konstrukt sind die ständigen Deletes, die sehr viel Zeit brauchen und Unordnung in die Tabellenstruktur bringen. Man muss die Tabellen öfter optimieren um die entstehenden Lücken zu beheben.
MySQL Insert Into ON Duplicate Key Update
Eine sauberere Lösung sind „Insert Into ON Duplicate Key Update“ Statements. Hierbei fügt man an den schon vorhandenen Insert Befehl nur noch ein Stück an. Erzeugt der Insert Befehl einen Fehler wegen doppeltem Key, dann wird kein Fehler geworfen, sondern ein Update ausgeführt.
INSERT INTO test SET id = '1', value = 'Hallo' ON DUPLICATE KEY UPDATE value = 'Hallo';
Ist die Zeile mit der id 1 noch nicht vorhanden, dann wird sie nun angelegt. Ansonsten wird value geupdatet. Mit Inserts kann man noch viele andere schöne Dinge machen, aber dazu mehr später.
Related posts:
Danke für den Tipp, genau das brauch ich jetzt und super erklärt auch für Dummies wie mich
Juergen