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 :
A noter que dans le cas des personnes utilisant une version plus ancienne de MySQL, il existe la possibilité de modifier la requête insert pour la remplacer par une requête REPLACE. Pour cela il suffit de remplacer INSERT par REPLACE.
Le soucis sera néanmoins qu’une telle requête commence par supprimer l’enregistrement de la table s’il existe avant de l’ajouter avec les nouvelles valeurs. Les performances sont donc moins intéressantes :o(.
Sinon il y a aussi cela :
REPLACE into latable VALUES(‘val1’, ‘val2’);
si la ligne n’existe pas en clef primaire val1 il y aura insertion, sinon il y aura mise à jour 🙂
niveau perf, si le serv est configuré de manière optimal, le nombre de tick sera identique entre un replace ou un insert+update.
Pour l’id qui change, il est possible de le signaler dans la requete avec le DUPLICATE KEY.
Que dire si ce n’est un grand Merci…