如果存在则更新

时间:2011-08-28 06:32:59

标签: mysql

  

可能重复:
  How do I update if exists, insert if not (aka upsert or merge) in MySQL?

我有一个包含用户,类别和分数列的表格。我想运行一个插入,如果此用户/类别组合已经存在,则只更新分数。用户和类别列可以多次具有相同的值,但每个特定的用户/类别组合可能只存在于一行中。我怎么能这样做?

非常感谢

2 个答案:

答案 0 :(得分:3)

对于这个例子,让我们调用你的表分数:

确保您拥有唯一索引

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

现在运行此替换:

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

如果您更新分数意味着加分,那么请执行以下操作:

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

试一试!

更新2011-08-28 09:00美国东部时间

如果您想保持高分,然后添加唯一索引,则必须执行以下操作:

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;

更新2011-08-28 10:53美国东部时间

运行此选项以保持最高分:

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

答案 1 :(得分:0)

你想要的是INSERT ... ON DUPLICATE KEY UPDATE。确保您在用户,类别上定义了唯一索引。见http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html