La question est vieille, mais je voudrais étendre le sujet avec une autre réponse.
Mon point est, le moyen le plus facile à atteindre, il est juste à enrouler plusieurs requêtes avec une transaction. La accepté de répondre INSERT ... ON DUPLICATE KEY UPDATE
est un hack sympa, mais il faut être conscient de ses inconvénients et limites:
- Comme dit, si vous arrivez à lancer une requête avec des lignes dont la principale clé n'existe pas dans la table, la requête permet d'insérer de nouveaux "mi-cuit" des dossiers. Probablement ce n'est pas ce que vous voulez
- Si vous avez une table avec un pas de champ nul, sans valeur par défaut et ne voulez pas toucher ce champ dans la requête, vous obtiendrez
"Field 'fieldname' doesn't have a default value"
MySQL avertissement, même si vous ne l'insérez pas une seule ligne à tous. Il va vous causer des ennuis, si vous décidez d'être strict et tourner mysql avertissements des exceptions d'exécution de votre application.
J'ai fait quelques tests de performance sur les trois proposées, y compris les variantes de l' INSERT ... ON DUPLICATE KEY UPDATE
variante, une variante avec des "cas / quand / puis, une clause" et une approche naïve de la transaction. Vous pouvez obtenir le code python et les résultats ici. La conclusion générale est que la variante avec l'instruction de cas s'avère être deux fois plus rapide que les deux autres variantes, mais il est assez difficile d'écrire à corriger et l'injection de code de sécurité pour elle, donc, personnellement, je en tenir à l'approche la plus simple: l'utilisation de transactions.