Mysql 调整重复密钥更新时的插入
我正在尝试更改一些旧的不推荐的代码,说明如何在游戏中保存项目。当前方法是删除所有项目,然后插入所有项目,然后插入设备(项目的子表)。它对性能有很大的影响,我想知道在重复密钥更新时将插入更改为插入是否会对性能产生明显的影响 如果是的话,我还有一个后续问题。我的计划是使用原始的inventoryitemid加载项目,并将其用作以后保存的键 问题在于执行以下语句时:Mysql 调整重复密钥更新时的插入,mysql,Mysql,我正在尝试更改一些旧的不推荐的代码,说明如何在游戏中保存项目。当前方法是删除所有项目,然后插入所有项目,然后插入设备(项目的子表)。它对性能有很大的影响,我想知道在重复密钥更新时将插入更改为插入是否会对性能产生明显的影响 如果是的话,我还有一个后续问题。我的计划是使用原始的inventoryitemid加载项目,并将其用作以后保存的键 问题在于执行以下语句时: INSERT INTO inventoryitems (inventoryitemid, itemid) VALUES (?, ?) O
INSERT INTO inventoryitems (inventoryitemid, itemid) VALUES (?, ?) ON DUPLICATE KEY UPDATE ...
可能会错过一些条件。我想要的是,如果MySQL不存在默认值(自动递增),则插入MySQL,否则更新。此时生成的新项的inventoryitemid为0,因为键是在INSERT上生成的
tl;dr:我需要一种方法,在不事先拥有inventoryitemid的情况下插入重复密钥更新(因为新项目是在inventoryitemid为0的游戏中生成的)。目前,我必须事先指定inventoryitemid是什么,我可能无法访问该信息
首要目标和问题
尝试解决方案:使用NULL插入值要尝试触发自动增量,请在插入新行时指定
inventoryitemid=NULL
。这将创建一个新行,因为它不是重复的键,并且它将自动递增inventoryitemid
像这样插入新项目后,可以使用LAST\u insert\u ID()
获取分配给它的inventoryitemid
。然后,您可以将其发送到游戏代码,以便它知道新项目具有此ID。然后,它可以在将来的更新中使用此ID,而不是发送NULL
修改现有行时,请指定其
inventoryitemid
的值。然后,重复密钥更新上的代码将替换它,而不是插入新行。听起来好像替换而不是插入可以解决问题()itemid
唯一吗?@TadejPREPLACE
需要与INSERT ON DUPLICATE KEY UPDATE
@KarlLaurentiusRoos相同的唯一性标准unique@Barmar附近有工作吗?那部分工作。我关心的是,当一个新项目在游戏中生成时,它不会知道它的inventoryitemid。因此,当我在查询中添加信息时,我不知道向它提供什么,因为Java会将新的inventoryitemid实例化为0,这是有问题的。我想要的是,如果它是新的,我希望它被插入,否则会被更新。当你创建一个新的项目时,你必须将inventoryitemid
发送回游戏代码,以便它将来能够更新它。因为这非常昂贵,我应该怎么做?当怪物死亡并掉落时,该物品在游戏中创建。因为我不想每次玩家遇到物品时都保存,所以我会在他们注销时保存。在这段时间内,最初的解决方案是删除所有物品,然后重新插入,而不用担心更新。但是现在因为我想更新,我引入了inventoryitemid,但这也意味着我需要一种方法将新项目插入数据库并生成一个键。为什么会出现这个问题?保存时,所有新项目都会得到NULL
,因为它们还没有ID。所有旧项目都有其ID。您也可以在Java代码中使用if
语句。如果知道ID,则执行更新
,如果不知道,则执行插入
。