可能重複:
How do I update if exists, insert if not (aka upsert or merge) in MySQL?更新是否存在
我與列用戶,類別和評分表。我想運行一個插入,如果此用戶/類別組合已經存在,而只是更新分數。用戶和類別列可以多次具有相同的值,但每個特定的用戶/類別組合可能只存在於單個行中。我怎樣才能做到這一點?
非常感謝
可能重複:
How do I update if exists, insert if not (aka upsert or merge) in MySQL?更新是否存在
我與列用戶,類別和評分表。我想運行一個插入,如果此用戶/類別組合已經存在,而只是更新分數。用戶和類別列可以多次具有相同的值,但每個特定的用戶/類別組合可能只存在於單個行中。我怎樣才能做到這一點?
非常感謝
在這個例子中,我們打電話給你的表的分數:
確保你有一個唯一索引
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);
試試吧!
UPDATE 2011-08-28 09:00 EDT
如果你想保持公正高分,然後添加唯一索引,這裏是你必須做的:
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;
UPDATE 2011-08-28 10:53 EDT
運行是爲了保持最高得分:
INSERT INTO scores (user,category,score) VALUES ('username','mycat',127)
ON DUPLICATE KEY UPDATE score = GREATEST(VALUES(score),score);
你需要的是INSERT ... ON DUPLICATE KEY UPDATE
。確保您在用戶,類別上定義了唯一的索引。見http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
這似乎是正確的,但我不能添加唯一索引,因爲此索引的大量重複行已經存在。有什麼方法可以刪除重複項並只保留最高分的那一行?我試圖循環所有的組合,但它不起作用,我想必須有更好的方法。 – Fred
非常感謝您的第一個答案以及更新!這正是我需要的。 – Fred