241 votes

INSERT ... ON DUPLICATE KEY (ne rien faire)

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 parce que 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 

?

415voto

ceejayoz Points 85962

Oui, utilisez INSERT ... ON DUPLICATE KEY UPDATE id=id (il ne déclenchera pas de mise à jour de la ligne même si id est affecté à lui-même).

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

7 votes

Juste pour ajouter IGNORE après l'INSERT, le reste de la syntaxe est la même ?

26 votes

@ufk : INSERT IGNORE sans le ON DUPLICATE KEY partie, par exemple INSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)

139 votes

Notez que INSERT IGNORE ignore également d'autres erreurs telles que les échecs de conversion de données.

31voto

Kim Points 197

Comment implémenter l'option "insert if not exist" ?

1. REPLACE INTO

pros :

  1. simple.

contre :

  1. trop lent.

  2. la clé d'auto-incrémentation CHANGER (augmenter de 1) s'il y a des correspondances d'entrée unique key ou primary key car il supprime l'ancienne entrée et en insère une nouvelle.

2. INSERT IGNORE

pros :

  1. simple.

contre :

  1. la clé d'auto-incrémentation ne changera pas s'il y a des correspondances d'entrée unique key ou primary key mais l'index d'auto-incrémentation augmentera de 1

  2. certaines autres erreurs ou avertissements seront ignorés, comme les erreurs de conversion de données.

3. INSERT ... ON DUPLICATE KEY UPDATE

pros :

  1. vous pouvez facilement implémenter la fonction "sauver ou mettre à jour" avec ceci

contre :

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

  2. la clé d'auto-incrémentation ne changera pas s'il y a des correspondances d'entrée unique key ou primary key mais l'index d'auto-incrémentation augmentera de 1

4. Un moyen d'empêcher l'augmentation automatique de la clé s'il y a des correspondances d'entrée ? unique key ou primary key ?

Comme mentionné dans le commentaire ci-dessous par @toien : "l'auto-incrément de la colonne sera effectué dépend de innodb_autoinc_lock_mode config après la version 5.1" si vous utilisez l'option innodb comme moteur, mais cela affecte aussi la concurrence, et il faut donc bien réfléchir avant de l'utiliser. Jusqu'à présent, je ne vois pas de meilleure solution.

0 votes

La colonne d'auto-incrémentation sera effectuée dépend de innodb_autoinc_lock_mode configuration après la version 5.1

1voto

Peter Points 59

Utilisez ON DUPLICATE KEY UPDATE ... ,
Négatif : parce que le UPDATE utilise des ressources pour la deuxième action.

Utilisez INSERT IGNORE ... ,
Négatif : MySQL n'affichera pas d'erreurs si quelque chose ne va pas, vous ne pouvez donc pas gérer les erreurs. Ne l'utilisez que si vous ne vous souciez pas de la requête.

0 votes

@abdul existe-t-il un support mysql pour ce que vous avez expliqué ici ?

-15voto

dhanesh mane Points 19

Essayez ce style de requête.

INSERT INTO `table1` (`field1`, `field2`, `field3`) 
VALUES (150,73,'YES' ) 
ON DUPLICATE KEY UPDATE field3 = 'NO'

Dans ce cas, j'ai une clé unique sur le champ 1 et le champ 2.

profiter.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X