调整INSERT ON DUPLICATE KEY UPDATE

时间:2017-05-04 20:33:02

标签: mysql

我正在尝试更改一些旧的弃用代码,以了解如何在游戏中保存项目。当前方法是删除所有项目,然后插入所有项目,然后插入设备(项目的子表)。它具有相当大的性能影响,我想知道将INSERTS更改为INSERTS ON DUPLICATE KEY UPDATE会对性能产生显着影响。

如果确实如此,那么我有一个后续问题。我的计划是使用原始 inventoryitemid 加载项目,然后将其用作以后保存的密钥。

问题在于执行以下语句时:

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

可能会错过某些条件。如果MySQL不存在默认值(自动增量),我想要的是INSERT INSERT,否则更新。目前生成新项目时,inventoryitemid为0,因为无论如何都会在INSERT上生成密钥。

tl; dr :我需要一种方法来在不事先拥有inventoryitemid的情况下插入DUPLICATE KEY UPDATE(因为新的项目是在游戏中使用inventoryitemid为0生成的)。目前我必须事先指定inventoryitemid是什么,我可能无法访问该信息。

第一个目标和问题

  1. 尝试在事先没有inventoryitemid的情况下插入数据库中不存在的新项目。
  2. 项目未使用下一个递增的db值插入数据库。
  3. 第二个目标(没有问题)

    1. 尝试使用现有库存itemid将项目插入数据库
    2. 数据库成功更新数据库中的项目(耶!)
    3. 尝试解决方案:使用NULL插入值以尝试触发自动增量

1 个答案:

答案 0 :(得分:0)

如果您要插入新行,请指定inventoryitemid = NULL。这将创建一个新行,因为它不是重复键,它会自动增加inventoryitemid

插入此类新项后,您可以使用LAST_INSERT_ID()获取分配给它的inventoryitemid。然后您可以将其发送到游戏代码,以便知道新项目具有此ID。然后,它可以在将来的更新中使用此ID,而不是发送NULL

当您修改现有行时,请指定其inventoryitemid的值。然后ON DUPLICATE KEY UPDATE代码将替换它而不是插入新行。