Dans une application web on peut avoir besoin de modifier un enregistrement si il existe, ou de le créer si il n’existe pas.
La première chose qui viens à l’esprit est d’effectuer cela en deux requêtes : un « SELECT » pour savoir si l’enregistrement est présent, puis un « INSERT » ou un « UPDATE » en fonction du résultat. C’est un peu lourd pour une requête basique comme celle-ci.
Mais bien sûr notre ami SQL à tout prévu, et on peut réaliser cela en une malheureuse requête grâce à la clause « ON DUPLICATE KEY ».
Le contexte
Fermez les yeux et imaginez … Un site ou l’on doit enregistrer l’adresse ip et le nom du navigateur de chaque visiteurs avec la date de dernière connexion à la page. On va faire un « INSERT » avec toutes les infos la première fois que le visiteur va se connecter. Mais à ses prochaines connexions on va seulement modifier la date de connexion de ce même utilisateur, l’ip et le navigateur resterons les mêmes (sauf si il en change, ok).
La table
Dans un premier temps on créé une table « users » avec les champs : id | ip | navigateur | date .
Ensuite le point le plus important : on mets un index « UNIQUE » sur les champs « ip » et « navigateur ». C’est cela qui va permettre de savoir si on fait un update ou un insert.
La requête
Lorsque le visiteur passe sur la page on exécute cette requête (en admettent le fait que dans la variable $ip se trouve l’adresse ip de la personne et dans $nav le nom du navigateur) :
INSERT INTO users (id, ip, navigateur, date) VALUES ($ip, $nav, NOW()) ON DUPLICATE KEY UPDATE date = NOW()
La requête va enregistrer l’adresse ip ($ip) avec la date de connexion (NOW()) si la combinaison ip/navigateur n’existe pas déjà. Si cette combinaison existe elle va simplement modifier la valeur du champs « date ».
Tags : on duplicate key, SQL