Imaginez que nous avons une table :
SQL :
CREATE TABLE iphits ( ip varchar(50) NOT NULL, dateInsert DATETIME NOT NULL, PRIMARY KEY (ip ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
Pour éviter à chaque fois la vérification de données (dans notre cas IP), il existe deux méthodes SQL très simples :
Méthode 1 : REPLACE
SQL :
REPLACE INTO iphits SET ip = '192.165.1.1', dateInsert = NOW() ;
Si la ligne existe (IP), elle sera remplacée, si elle n’existe pas encore, il sera créé.
Cependant, cette méthode n’est pas efficace/optimisée pour notre cas : nous n’avons pas besoin d’écraser les enregistrements existants.
Méthode 2 : INSERT IGNORE
SQL :
INSERT IGNORE INTO iphits SET ip = '192.165.1.1', dateInsert = NOW() ;
Ici, si l’ip est déjà présent dans la table, il sera ignoré.
(Pour être plus précis, voici une citation de manuel de référence MySQL :
Si on spécifie le mot IGNORE dans un INSERT avec les valeurs de plusieurs lignes, chaque ligne qui ferait doublon avec une clé PRIMARY ou UNIQUE existante dans la table sera ignoré et ne sera pas insérée. Si on ne spécifie pas IGNORE, l’insertion est abandonnée si quelque ligne que ce soit fait doublon avec une clé existante. La fonction mysql_info() de l’API C permet de savoir combien de lignes ont été insérées dans la table.
Cette deuxième méthode présente plusieurs faiblesses potentielles, y compris les non-abondons de la requête dans le cas de tout autre problème se produit (voir le manuel)