Nehmen wir folgenden Fall an: Ich habe eine Tabelle mit verschiedenen Werten.
CREATE TABLE `xyz` ( `a` VARCHAR(50) NOT NULL, `b` INT(10) NOT NULL DEFAULT '0', `c` DATETIME NOT NULL );
Bisher wurden die Werte wild hinzugefügt oder geändert.
INSERT INTO `xyz` (`a` ,`b` ,`c`) VALUES ('Testeintrag', '123', NOW()); oder UPDATE `xyz` SET `a`='Testeintrag',`c`=NOW() WHERE b='123';
Jetzt aber möchte ich dieser Tabelle etwas hinzufügen – aber nur dann – wenn der Wert in Spalte b nicht existiert. Andernfalls muss der Eintrag geändert werden. Dieses Konstrukt über die Applikationslogik(en) abzubilden, wäre in meinem Fall aber recht aufwändig gewesen. Deshalb musste eine andere Lösung her.
MySQL bietet in diesem Fall eine einfache Lösung an INSERT … ON DUPLICATE KEY UPDATE. Hierzu muss die entscheidende Spalte b als UNIQUE definiert werden (Hinweis: Doppelte Eintrage in MySQL Tabelle finden) und die Query in der Applikation wie folgt angepasst werden.
INSERT INTO `xyz` (`a` ,`b` ,`c`) VALUES ('Testeintrag', '123', NOW()) ON DUPLICATE KEY UPDATE `a`='Testeintrag',`c`=NOW();
Wenn jetzt der Wert der Spalte b bereits in der Tabelle enthalten ist, wird diese Spalte einfach aktualisiert.
Weitere Informationen zum Thema:
http://dev.mysql.com/doc/refman/5.1/de/insert-on-duplicate.html