2009-10-15 40 views
1

我有一个表,其中包含我的游戏拥有的用户的项目。如果用户购买了新物品,则应该插入该物品,但如果他已经购买了物品,则应该增加。我可以使用INSERT ... ON DUPLICATE KEY UPDATE,但我不明白我的问题。如何插入一行,但重复;更新它呢?

item_id不是唯一的,因为许多玩家可以拥有相同的武器(即长剑)。 user_id也不是唯一的,因为玩家可以拥有很多物品。

所以,我的问题是如何使查询UPDATE,而不是INSERT如果一行包含user_iditem_id已经存在?

回答

2

这不是“ON DUPLICATE KEY UPDATE”会为你做的事情。如果是我,我会尝试插入。如果失败,请检查原因(您是否在检查错误,对不对?)。如果是因为重复密钥,请更新。如果错误是由于其他原因,那么适当处理。

+0

根据主键约束或表上的任何其他唯一约束/索引来检测副本。 事情是,这听起来像你有一个“数量”列。如果您插入一行,您希望数量为1.如果因为播放器已经有1而更新,那么您希望数量递增...... ON DUP KEY UPDATE只会使现有的行与您相匹配想要插入。你必须按照我的建议去做,或者先找到这一行的主题。我更喜欢我的方式。 – 2009-10-15 22:00:09

+0

顺便说一句,我的推理:首先检查总是需要两个查询。尝试并检查结果,如果它是dup,则只需要两个查询。 – 2009-10-15 22:02:09

+0

对不起,我编辑后删除了我的评论。好吧,我只是想知道是否有可能只使用一个查询来做到这一点。 – Phoexo 2009-10-15 22:03:01

2

你确实想要重复密钥更新。它查找表的主键,如果存在,则更新所有其他行。

所以,你的表有(用户ID,商品ID)和下列值的主键:

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但userid 70的行),因为它们不匹配整个PK。

+0

从技术上讲,它是主键或任何独特的键 – 2009-10-15 21:57:43

1

你可以做类似如下(假设你的用户ID是在变量的用户ID和项目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; 
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 
3

我知道这个问题很老,但没有一个答案是正确的。

您需要user_id和item_id(一个索引中的两列)的PRIMARY or UNIQUE索引。

然后你可以使用"INSERT INTO ... VALUES ... ON DUPLICATE KEY UPDATE count=count+1"没问题。

这是EXACTLY什么ON DUPLICATE UPDATE会为你做。

+0

旧的,我在2015年得到答案 - 谢谢,与UNIQUE一起使用,工作。 – Setrino 2015-08-13 07:38:59