2017-05-04 162 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,但这也意味着我需要一种方法将新项插入数据库并生成密钥。 –