2009-10-15 19 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