INSERT IF NOT EXISTS
Il existe 3 solutions possibles : l'utilisation de INSERT IGNORE, REPLACE, ou INSERT ... ON DUPLICATE KEY UPDATE. ON DUPLICATE KEY UPDATE.
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=latin1 ;
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)
Il ya une autre option : utiliser INSERT ... ON DUPLICATE KEY UPDATE