2017-05-04 161 views
0

我想改變一些舊的棄用代碼,如何在我的遊戲中保存項目。目前的方法是刪除所有項目,然後插入所有項目,然後插入設備(項目的子表)。它具有相當大的性能影響,我想知道是否將INSERTS更改爲INSERTS ON DUPLICATE KEY UPDATE會對性能產生顯着影響。調整插入重複密鑰更新

如果是這樣,那麼我有一個後續問題。我的計劃是使用原始的inventoryitemid加載項目並將其用作稍後保存的密鑰。

的問題是執行這個下面的語句時:

INSERT INTO inventoryitems (inventoryitemid, itemid) VALUES (?, ?) ON DUPLICATE KEY UPDATE ... 

可能會錯過一些條件。我想爲MySQL插入,如果它不存在默認值(自動增量),否則更新。目前,使用inventoryitemid生成的新項目由於在INSERT上生成密鑰而生成。我需要一種方法來在INSERT ON DUPLICATE KEY UPDATE之前事先沒有inventoryitemid(因爲新物品是在inventoryizemid爲0的遊戲中生成的)。目前我必須事先指定inventoryitemid,我可能無法訪問這些信息。

第一個目標和問題

  1. 嘗試插入不在數據庫中事先不具有inventoryitemid存在的新項目。
  2. 項目沒有插入數據庫,下一個遞增的db值。

第二個目標(沒有問題)

  1. 試圖插入項目插入數據庫與現有的庫存爲itemid
  2. 數據庫更新項目數據庫中的成功(耶!)

嘗試解決方案:使用NULL插入值以嘗試觸發自動增量

+0

聽起來像REPLACE,而不是INSERT可以節省您的問題(https://dev.mysql.com/doc/refman/5.7/en/replace.html) – TadejP

+0

'itemid'是唯一的嗎? –

+0

@TadejP'REPLACE'需要與'INSERT ON DUPLICATE KEY UPDATE'相同的唯一性標準。 – Barmar

回答

0

當您處於請關注新行,指定inventoryitemid = NULL。這將創建一個新行,因爲它不是重複鍵,它會自動遞增inventoryitemid

插入一個像這樣的新項目後,您可以使用LAST_INSERT_ID()來獲取分配給它的inventoryitemid。然後,您可以將其發送到遊戲代碼,以便它知道新項目具有此ID。然後它可以在以後的更新中使用此ID,而不是發送NULL

當您修改現有行時,請指定其inventoryitemid的值。然後ON DUPLICATE KEY UPDATE代碼將替換它,而不是插入一個新行。

+0

這部分工作。我所關心的是遊戲中產生一個新物品時,它不會知道它的inventoryitemid。所以當我在查詢中添加信息時,我不知道該如何提供它,因爲Java會將新的inventoryitemid實例化爲0,這是有問題的。我想要的是,如果它是新的,我希望它插入,否則更新,如果這是有道理的。 –

+0

當您創建一個新項目時,您必須將'inventoryitemid'發送迴游戲代碼,以便將來能夠更新它。 – Barmar

+0

我應該怎麼做,因爲這是非常昂貴的?該物品在怪物死亡並掉落時在遊戲內部創建。由於我不希望每次玩家遇到物品時都保存,所以我在登出時保存等。在此期間,原始解決方案只是刪除所有物品,然後重新插入,而不必擔心更新。 但是現在,因爲我想更新,我引入了inventoryitemid,但這也意味着我需要一種方法將新項插入數據庫並生成密鑰。 –