INSÉRER… SUR LA CLÉ DUPLICATE (ne rien faire)

193

J'ai une table avec une clé unique pour deux colonnes:

CREATE  TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );

Je veux insérer une ligne dans cette table, mais si la clé existe, ne rien faire! Je ne veux pas qu'une erreur soit générée car les clés existent.

Je sais qu'il existe la syntaxe suivante:

INSERT ... ON DUPLICATE KEY UPDATE ...

mais y a-t-il quelque chose comme:

INSERT ... ON DUPLICATE KEY DO NOTHING 

?

ufk
la source

Réponses:

341

Oui, utilisez INSERT ... ON DUPLICATE KEY UPDATE id=id(cela ne déclenchera pas la mise à jour de la ligne même s'il lui idest assigné).

Si vous ne vous souciez pas des erreurs (erreurs de conversion, erreurs de clé étrangère) et de l'épuisement des champs d'auto-incrémentation (il est incrémenté même si la ligne n'est pas insérée en raison d'une clé en double), utilisez INSERT IGNORE.

ceejayoz
la source
5
juste pour ajouter IGNORE après l'INSERT, le reste de la syntaxe est le même?
ufk le
25
@ufk: INSERT IGNOREsans la ON DUPLICATE KEYpièce, par exempleINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
BoltClock
125
Notez que INSERT IGNORE ignore également d'autres erreurs telles que les échecs de conversion de données.
mjcopple
36
donc je vais utiliser ON DUPLICATE KEY UPDATE id = id. Je veux seulement ignorer les doublons de clé et non aucun autre type d'erreur.
ufk
7
attention INSERT IGNORE incrémentera la colonne auto-incrémentée même si la ligne n'est pas insérée
WorM
12

COMMENT METTRE EN ŒUVRE «insérer si non»?

1. REPLACE INTO

avantages:

  1. Facile.

les inconvénients:

  1. trop lent.

  2. la clé d'incrémentation automatique CHANGE (augmente de 1) s'il y a des correspondances d'entrée unique keyou primary key, parce qu'elle supprime l'ancienne entrée, insère une nouvelle.

2. INSERT IGNORE

avantages:

  1. Facile.

les inconvénients:

  1. la clé d'incrémentation automatique ne changera pas s'il y a des correspondances d'entrée unique keyou si primary keyl'index d'incrémentation automatique augmentera de 1

  2. certaines autres erreurs / avertissements seront ignorés tels qu'une erreur de conversion de données.

3. INSERT ... ON DUPLICATE KEY UPDATE

avantages:

  1. vous pouvez facilement implémenter la fonction `` enregistrer ou mettre à jour '' avec ce

les inconvénients:

  1. semble relativement complexe si vous voulez simplement insérer et non mettre à jour.

  2. la clé d'incrémentation automatique ne changera pas s'il y a des correspondances d'entrée unique keyou si primary keyl'index d'incrémentation automatique augmentera de 1

4. Un moyen d'arrêter d'augmenter la clé d'incrémentation automatique s'il y a des correspondances d'entrée unique keyou primary key?

Comme mentionné dans le commentaire ci-dessous par @toien: "la colonne d'auto-incrémentation sera effectuée dépend de la innodb_autoinc_lock_modeconfiguration après la version 5.1" si vous l'utilisez innodbcomme moteur, mais cela affecte également la concurrence, il doit donc être bien pris en compte avant de l'utiliser. Jusqu'à présent, je ne vois pas de meilleure solution.

Kim
la source
colonne auto-incrément sera effectué dépend de innodb_autoinc_lock_modeconfig après la version 5.1
toien
1

Use ON DUPLICATE KEY UPDATE ...,
Negative: parce que le UPDATEutilise des ressources pour la deuxième action.

Utilisation INSERT IGNORE ...,
négative: MySQL n'affichera aucune erreur si quelque chose ne va pas, vous ne pouvez donc pas gérer les erreurs. Utilisez-le uniquement si vous ne vous souciez pas de la requête.

Abdul Aziz Al Basyir
la source
@abdul y a-t-il un support mysql ce que vous avez expliqué ici?
Lalit Tarsariya