我有一个表格,其中包含我的游戏用户所拥有的项目。如果用户购买了一个新项目,则应该插入该项目,但是如果他已经获得了该项目,则应该增加该项目。
我知道我可以使用INSERT ... ON DUPLICATE KEY UPDATE
,但我不明白我的问题是怎么回事。
item_id
不是唯一的,因为许多玩家可以拥有相同的武器(即长剑)。 user_id
也不是唯一的,因为玩家可以拥有许多物品。
所以,我的问题是如果包含UPDATE
和INSERT
的行已经存在,如何使查询user_id
而不是item_id
?
答案 0 :(得分:3)
我知道这个问题很陈旧,但没有一个答案是正确的。
您需要在user_id和item_id(一个索引中的两列)上建立PRIMARY or UNIQUE
索引。
然后你可以使用"INSERT INTO ... VALUES ... ON DUPLICATE KEY UPDATE count=count+1"
没问题。
这是EXACTLY
ON DUPLICATE UPDATE
将为您做的事情。
答案 1 :(得分:2)
这不是“ON DUPLICATE KEY UPDATE”将为您做的事情。如果是我,我会尝试插入。如果失败,请检查原因(您正在检查错误,对吧?)。如果是因为重复密钥,请进行更新。如果错误是由于其他原因,那么请妥善处理。
答案 2 :(得分:2)
您确实需要 ON DUPLICATE KEY UPDATE 。它查找表的主键,如果存在,则更新所有其他行。
因此,您的表具有(userid,itemid)主键和以下值:
userid itemid strength
4 5 6
你想把它加到强度= 9,使用它:
INSERT INTO table ON DUPLICATE KEY UPDATE VALUES(4,5,9)
如果它不存在,它将插入一个带有4,5,9的行,并且如果它存在,则将使用主键(4,5)的行更新强度为9 。它不会更新任何其他行(例如,带有userid4但是itemid 10或itemid 5但是用户ID 70的行),因为它们与整个PK不匹配。
答案 3 :(得分:1)
您可以执行以下操作(假设您的用户ID位于变量UserID中且项目ID位于item_ID中):
SELECT
@rowCount := COUNT(*)
FROM
table
WHERE
user_id = UserID
AND item_id = ItemID;
IF (@rowCount > 0) THEN
... do update
ELSE
... do insert
END IF;
答案 4 :(得分:0)
你能做点什么吗
UPDATE TABLE
set COL = 'BLAH BLAH'
where ITEM_ID = @itemid AND USER_ID = @userid
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO TABLE (col...)
VALUES (vals...
END