Qui ne s’est jamais agacé devant des applications ou il faut traiter différemment les INSERT et les UPDATE ? Moi c’est le cas régulièrement, quand je ne perd pas mon temps à corriger des bugs induits par ces doublon fonctionnels.
La solution est simple, proposée par MySql (j’ignore son implémentation sur d’autres bases), en voici un exemple.

Avant, c’était pas très propre …

$result=mysql_query("UPDATE table SET champs='donnée' WHERE cle=1"); if($result) { if(mysql_affected_rows()==0) { mysql_query("INSERT INTO table (cle,champs) VALUES (1,'donnée')"); } }

Que dire de ce code ? Si ce n’est que c’est simplement moche !!!!

MySql à partir de la version 4.1.0 à ajouté un mécanisme permettant dans une requête de faire soit un update soit un select en jouant sur la contrainte d’unicité des clés.
Je m’explique… Si vous insérez deux fois une même clé dans une table, MySql déclenche un événement « DUPLICATE KEY » que vous pouvez utilisez pour gérer l’update le plus simplement du monde.

Voyons ce que donnerais la requête précédente :

$result=mysql_query("INSERT INTO table (cle,champs) VALUES (1,'donnée') ON DUPLICATE KEY UPDATE champs='donnée'");

Par cette opération, la base effectuera soit un insert si la clé (dans notre exemple : cle) n’existe pas, soit un update de « champs » si la clé existe.
Voici de très bon articles sur le sujet :