我正在尝试更改一些旧的弃用代码,以了解如何在游戏中保存项目。当前方法是删除所有项目,然后插入所有项目,然后插入设备(项目的子表)。它具有相当大的性能影响,我想知道将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是什么,我可能无法访问该信息。
第一个目标和问题
第二个目标(没有问题)
尝试解决方案:使用NULL插入值以尝试触发自动增量
答案 0 :(得分:0)
如果您要插入新行,请指定inventoryitemid = NULL
。这将创建一个新行,因为它不是重复键,它会自动增加inventoryitemid
。
插入此类新项后,您可以使用LAST_INSERT_ID()
获取分配给它的inventoryitemid
。然后您可以将其发送到游戏代码,以便知道新项目具有此ID。然后,它可以在将来的更新中使用此ID,而不是发送NULL
。
当您修改现有行时,请指定其inventoryitemid
的值。然后ON DUPLICATE KEY UPDATE
代码将替换它而不是插入新行。