Accueil du site > Blog > MySQL > INSERT IF NOT EXISTS

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

 

Réagissez à cet article ?!

Dans la même rubrique

INSERT ON DUPLICATE KEY UPDATE

INSERT ... ON DUPLICATE KEY UPDATE est une manière très puissante/rapide mais souvent oubliée dans MySQL. Elle a été introduite en MySQL 4.1, mais constamment les développeurs l'ignorent encore ! Personnellement j'aime cette fonctionnalité surtout qu'elle est conçue dans un style très MySQL - cette solution est très efficace pour les (...)

Les bases de données épaisses

Frédéric Brouard a lancé un pavé dans la marre du développement en expliquant le concept de “bases de données épaisses“. Il va même plus loin en affirmant que ce mode de développement peut assassiner les ORM et les FrameWorks. Pour rappel, l’ORM (pour “Object-Relational Mapping“) vise à faire correspondre un objet de la couche applicative aux données (...)