Dupliquer et ignorer sur les insertions MySQL

Les clés primaires et les index uniques de la table MySQL empêchent l'ajout de plusieurs lignes avec le même index à la table. Si vous essayez d'insérer une ligne en double avec une instruction INSERT standard, vous rencontrerez une erreur et l'insertion échouera.

MySQL fournit plusieurs alternatives à l'instruction INSERT standard et chacune gère les lignes dupliquées légèrement différemment: "INSERT IGNORE", "INSERT ... ON DUPLICATE KEY UPDATE" et "REPLACE".

Clés primaires et index uniques

Les index de clé primaire et les contraintes d'index "UNIQUE" exigent que chaque ligne contienne une valeur unique dans la ou les colonnes d'index, permettant à chaque ligne d'être identifiée par sa clé primaire ou la valeur dans la ou les colonnes de contrainte d'index UNIQUE.

Si un INSERT normal tente d'insérer une ligne qui contient une valeur en double dans la clé primaire ou l'index de contrainte UNIQUE, l'insertion échouera, annulant éventuellement la transaction entière.

INSÉRER IGNORER

INSERT IGNORE insérera des lignes de la même manière que INSERT, mais à l'exception du fait qu'il ignorera les lignes avec des valeurs en double et continuera l'exécution sans créer d'erreur. Toute ligne contenant une valeur en double ne sera pas insérée; par exemple:

INSERT IGNORE INTO my_table (unique_index_column, other_column) VALUES (1, 'other value');

INSÉRER ... LORS DE LA MISE À JOUR DE LA CLÉ EN DOUBLE

INSERT ... ON DUPLICATE KEY UPDATE insérera toutes les lignes non dupliquées comme d'habitude. Cependant, lorsqu'il rencontre une ligne en double, il effectuera une MISE À JOUR sur la ligne d'origine; par exemple:

INSERT INTO my_table (unique_index_column, other_column) VALUES (1, 'other value') ON DUPLICATE KEY UPDATE other_column = 'duplicate update value';

REMPLACER

REPLACE fonctionne de la même manière que INSERT, sauf que lorsqu'il rencontre une ligne en double, il supprime la ligne d'origine, puis continue l'insertion. Toute ligne avec une valeur d'index unique en double remplacera la ligne qui contenait à l'origine la valeur; par exemple:

REPLACE INTO my_table (unique_index_column, other_column) VALUES (1, 'other value')