如何插入一行,但重复;更新它?

时间:2009-10-15 21:51:16

标签: mysql insert

我有一个表格,其中包含我的游戏用户所拥有的项目。如果用户购买了一个新项目,则应该插入该项目,但是如果他已经获得了该项目,则应该增加该项目。

我知道我可以使用INSERT ... ON DUPLICATE KEY UPDATE,但我不明白我的问题是怎么回事。

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

所以,我的问题是如果包含UPDATEINSERT的行已经存在,如何使查询user_id而不是item_id

5 个答案:

答案 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