Mysql 如果存在,则更新

Mysql 如果存在,则更新,mysql,Mysql,可能重复: 我有一个包含user、category和score列的表。我想运行一个插入,如果这个用户/类别组合已经存在,只需更新分数。用户和类别列可以多次具有相同的值,但每个特定的用户/类别组合只能存在于一行中。我该怎么做 非常感谢您需要的是插入。。。在重复密钥更新时。确保在用户、类别上定义了唯一索引。请参见您想要的是插入。。。在重复密钥更新时。确保在用户、类别上定义了唯一索引。参见本例,我们将您的表格分数称为: 确保你有一个唯一的索引 ALTER TABLE scores ADD UNIQU

可能重复:

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


非常感谢

您需要的是
插入。。。在重复密钥更新时
。确保在用户、类别上定义了唯一索引。请参见您想要的是
插入。。。在重复密钥更新时
。确保在用户、类别上定义了唯一索引。参见

本例,我们将您的表格分数称为:

确保你有一个唯一的索引

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);

在本例中,我们将您的表格分数称为:

确保你有一个唯一的索引

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);

这似乎刚刚好,但我不能添加唯一索引,因为这个索引已经存在很多重复的行。是否有办法删除重复项并只保留得分最高的行?我试着循环所有的组合,但没有成功,我想一定有更好的方法。非常感谢你的第一个答案以及更新!这正是我所需要的。这似乎刚刚好,但我不能添加唯一索引,因为这个索引已经存在很多重复行。是否有办法删除重复项并只保留得分最高的行?我试着循环所有的组合,但没有成功,我想一定有更好的方法。非常感谢你的第一个答案以及更新!这正是我需要的。