如果未找到MySQL更新行,请插入-首选先更新

如果未找到MySQL更新行,请插入-首选先更新,mysql,Mysql,我已经在下面看到了一些与此相关的问题 现在我有了一个汇总表,它在每次销售时都会更新数量。因此,在1000次商品销售中,只有第一次执行insert时,其余时间才会更新。我的理解是,Insert on Duplicate Key Update首先尝试插入,如果更新失败。因此,所有999次插入均未成功 1)是否有一种方法可以先检查Update,如果没有更新,则插入到单个语句中? 2) 考虑到大多数案例更新将成功,以下哪种方法是可取的 a) 使用重复密钥更新时插入的 b) 呼叫更新;如果没有受影响的行

我已经在下面看到了一些与此相关的问题

现在我有了一个汇总表,它在每次销售时都会更新数量。因此,在1000次商品销售中,只有第一次执行insert时,其余时间才会更新。我的理解是,
Insert on Duplicate Key Update
首先尝试插入,如果更新失败。因此,所有999次插入均未成功

1)是否有一种方法可以先检查Update,如果没有更新,则插入到单个语句中?

2) 考虑到大多数案例更新将成功,以下哪种方法是可取的

a) 使用重复密钥更新时插入的

b) 呼叫更新;如果没有受影响的行,则调用insert


现在我正在使用第二个选项(b)。性能增益在这里非常重要,而且我正在测试第一个选项。一旦完成,我会将结果发布到这里

在重复键上插入更新
是一种方法。它不会执行完全插入或您如何放置它。
要使此语句起作用,表上必须有主键或唯一键,并且语句中必须包含相应的列。
在决定是否必须执行insert或update语句之前,检查所述键。这通常非常快


使用“先更新”的方法,你什么也得不到,不,它会变得更糟。无论如何都必须进行主键查找。在最坏的情况下,您必须查找主键两次,从而浪费了时间。首先是update语句(可能不需要),然后是insert语句。

是否有代码显示。。。你试过什么?我想你可以用
如果存在
如果不存在
。然而,要发布一个有效的问题,你需要先带上你的答案。我建议使用另一种语言来检查,如果您查看
REPLACE
部分下的答案,则可能会重复此问题answered@MikeM. 不是复制品。这不是关于如何做到这一点,而是关于为什么要这样做,而不是OP的不同方法。在“更新优先”方法中,我只检查rowsaffected。如果为0,则插入。没有键查找。另一个想法是“大多数情况下更新都会成功”。因此,在这些场景中,问题是“更新”或“重复密钥更新时插入”哪个更好。您认为MySQL如何获得“受影响的行:0”结果?魔术不,是密钥查找。就像我说的,
在重复密钥更新时插入
是一种方法。。。