2009-12-11 3 views

Répondre

3

Non, il n'y en a pas.

INSERT ON DUPLICATE KEY UPDATE va localiser l'enregistrement et le mettre à jour comme le ferait un simple UPDATE.

En fait, il s'agit juste d'un UPDATE, suivi d'un INSERT en cas d'échec du UPDATE.

INSERT ON DUPLICATE KEY UPDATE peut être une alternative plus rapide à une mise à jour groupée (lorsque vous avez une table source avec plusieurs enregistrements par clé et que vous voulez incrémenter la table cible une fois par enregistrement).

S'il y a quelques valeurs par clé, cette requête:

INSERT 
INTO t_target 
SELECT target, cnt 
FROM t_sparse d 
ON DUPLICATE KEY UPDATE 
     t_target.cnt = t_target.cnt + d.cnt 

sera plus efficace que celui-ci:

INSERT 
INTO t_target 
SELECT target, cnt 
FROM (
     SELECT target, SUM(cnt) AS cnt 
     FROM t_sparse di 
     GROUP BY 
       target 
     ) d 
ON DUPLICATE KEY UPDATE 
     t_target.cnt = t_target.cnt + d.cnt 

Voir cet article dans mon blog pour plus de détails:

0

Je voudrais donner une réponse plus nuancée. Cela dépend de l'implémentation du SGBD. Néanmoins, par expérience, je peux vous dire que la plupart des SGBD ont un très bon support pour INSERT ... ON DUPLICATE UPDATE.

En fait, il est souvent possible d'améliorer les performances en utilisant INSERT ... ON DUPLICATE UPDATE puisque le système DMBS peut regrouper ces commandes, ce qui réduit le travail à effectuer. C'est le cas avec mysql et vous pouvez souvent voir une augmentation de 10 à 20% de la vitesse par rapport à une simple insertion + mise à jour sans aucun type de batching. Dans l'ensemble, je recommanderais le INSERT ... ON DUPLICATE UPDATE car il est plus simple à utiliser, votre code est plus facile à maintenir et conduit souvent à un gain de vitesse supplémentaire.

+0

Quels sont les autres SGBD (sauf MySQL) qui supportent cette clause? – Quassnoi

Questions connexes