2011-08-28 4 views
0

Possible en double:
How do I update if exists, insert if not (aka upsert or merge) in MySQL?mise à jour si elle existe

J'ai une table avec l'utilisateur de colonnes, catégorie et score. Je veux lancer une insertion qui, si cette combinaison utilisateur/catégorie existe déjà, met juste à jour le score. La colonne utilisateur et la colonne catégorie peuvent avoir la même valeur plusieurs fois, mais chaque combinaison utilisateur/catégorie spécifique peut uniquement exister sur une seule ligne. Comment puis-je faire ceci?

Un grand merci

Répondre

3

Pour cet exemple, nous allons appeler vos scores de table:

Assurez-vous que vous avez un index unique

ALTER TABLE scores ADD UNIQUE INDEX user_category_ndx (user,category); 

Lancez maintenant ce pour remplacer:

INSERT INTO scores (user,category,score) VALUES ('username','mycat',127) 
ON DUPLICATE KEY UPDATE score = VALUES(score); 

Si votre mise à jour le score signifie ajouter des scores, puis faites ceci:

INSERT INTO scores (user,category,score) VALUES ('username','mycat',127) 
ON DUPLICATE KEY UPDATE score = score + VALUES(score); 

Faites un essai!

MISE À JOUR 2011-08-28 09:00 HAE

Si vous voulez garder les scores élevés juste, puis ajoutez l'index unique, voici ce que vous devez faire:

CREATE TABLE scores_new LIKE scores; 
ALTER TABLE scores_new ADD UNIQUE INDEX user_category_ndx (user,category); 
INSERT INTO scores_new (user,category,score) 
SELECT user,category,MAX(score) FROM scores GROUP BY user,category; 
ALTER TABLE scores RENAME scores_old; 
ALTER TABLE scores_new RENAME scores; 
# 
# Drop old table if no longer needed 
# 
DROP TABLE scores_old; 

Mise à jour 2011-08-28 10:53 EDT

Exécuter ce pour garder le score maximum:

INSERT INTO scores (user,category,score) VALUES ('username','mycat',127) 
ON DUPLICATE KEY UPDATE score = GREATEST(VALUES(score),score); 
+0

Cela semble juste, mais je ne peux pas ajouter l'index unique car beaucoup de lignes dupliquées de cet index existent déjà. Y at-il un moyen de supprimer les doublons et de ne conserver que la ligne ayant le meilleur score? J'ai essayé de faire défiler toutes les combinaisons, mais cela n'a pas fonctionné et je suppose qu'il doit y avoir un meilleur moyen. – Fred

+0

Merci beaucoup pour votre première réponse ainsi que la mise à jour! C'est exactement ce dont j'ai besoin. – Fred

Questions connexes