You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SQL UPSERT操作会影响两行数据?

为什么UPSERT触发UPDATE时显示“2行受影响”,而INSERT是1行?

这其实是数据库处理UPSERT操作时的一个常见行为,尤其在使用MySQL的INSERT ... ON DUPLICATE KEY UPDATE语法时——我来给你拆解背后的逻辑:

  • MySQL的特殊计数规则
    当你执行这条UPSERT语句时,数据库内部会分两步处理:

    1. 首先尝试插入新行,此时检测到主键/唯一键冲突,插入操作失败;
    2. 接着触发UPDATE逻辑,对已存在的行进行修改。
      MySQL会把这两步操作合并计数,所以最终返回“2行受影响”——其中1代表尝试插入的行,1代表实际被更新的行。而当插入成功时,只有插入操作完成,自然返回1行受影响。
  • 如何获取真实的修改行数
    如果你的业务需要判断实际被更新的行数,可以执行UPSERT后调用SELECT ROW_COUNT();,这个函数会返回实际被修改的行数(更新时是1,插入时也是1),它不会统计内部的插入尝试步骤。

  • 其他可能的场景(比如SQL Server)
    如果你用的是SQL Server的MERGE语句,默认情况下受影响行数就是实际更新的1行。但如果你的表上存在UPDATE触发器,触发器内部如果有额外的写操作(比如插入日志表),可能会导致总受影响行数增加。不过从你的描述来看,更大概率是MySQL的场景。

  • 和你的表结构的关联
    虽然你省略了非键列,但你的表必然存在主键或唯一键(否则UPSERT无法识别重复行),正是这个键的冲突触发了更新逻辑,进而触发了上述的计数规则。

内容的提问来源于stack exchange,提问作者Nils Guillermin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:25:26