为何SQL UPSERT操作会影响两行数据?
为什么UPSERT触发UPDATE时显示“2行受影响”,而INSERT是1行?
这其实是数据库处理UPSERT操作时的一个常见行为,尤其在使用MySQL的INSERT ... ON DUPLICATE KEY UPDATE语法时——我来给你拆解背后的逻辑:
MySQL的特殊计数规则
当你执行这条UPSERT语句时,数据库内部会分两步处理:- 首先尝试插入新行,此时检测到主键/唯一键冲突,插入操作失败;
- 接着触发
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
相关产品推荐
相关产品推荐

