Lors d'une insertion en masse dans une table Mysql, si une clé existe déjà, la totalité de l'insertion n'est pas exécutée.
Pour ignorer cette erreur, il suffit d'utiliser le mot clé IGNORE dans la requête d'insertion.
Exemple :
Définition de la table test2
CREATE TABLE IF NOT EXISTS `test2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`val` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `val` (`val`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Définition d'une clé unique sur le champ "val".
Données de la table
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
+----+-----+
5 rows in set (0.00 sec)
Requête d'insertion en masse
mysql> INSERT INTO test2 (val) VALUES (60), (70), (10), (80);
ERROR 1062 (23000): Duplicate entry '10' for key 'val'
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
+----+-----+
7 rows in set (0.00 sec)
Lors de l'insertion, une erreur est générée pour la valeur "10".
Celle-ci existe déjà dans la table.
Le "SELECT" montre que seules les valeurs "60" et "70" ont été insérées.
La valeur "80" n'a pas été insérée car la requête a générée une erreur au moment de l'insertion de la valeur "10".
Requête d'insertion avec le mot clé "IGNORE"
mysql> INSERT IGNORE INTO test2 (val) VALUES (80), (90), (10), (100);
Query OK, 3 rows affected (0.00 sec)
Records: 4 Duplicates: 1 Warnings: 0
mysql> SELECT * FROM test2;
+----+-----+
| id | val |
+----+-----+
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
| 4 | 40 |
| 5 | 50 |
| 6 | 60 |
| 7 | 70 |
| 8 | 80 |
| 9 | 90 |
| 10 | 100 |
+----+-----+
10 rows in set (0.00 sec)
Le résultat de la requête indique que 3 insertions ont été exécutées sur 4.
La valeur "10" a été ignorée.
Le "SELECT" montre que les valeurs "80", "90" et "100" ont bien été insérées.