MySQL INSERT ON DUPLICATE KEY UPDATE ...返回“受影响的行:1”,但确实没有变化

问题描述 投票:8回答:2

我用列创建表,默认值为'1'

create table int_1 (
  id int not null auto_increment,
  value int default 1,
  primary key (id)
);

命令

insert into int_1 values(1, null) on duplicate key update value = null;

总是返回结果

1 row(s) affected

但是记录在第一次执行后确实改变了(插入)。但是如果我使用默认值'0'创建表,则所有表都按预期工作:

create table int_0 (
  id int not null auto_increment,
  value int default 0,
  primary key (id)
);
insert into int_0 values(1, null) on duplicate key update value = null;

返回

0 row(s) affected

第二次运行后“插入重复键”

检查MySQL 5.7,8.0

这种行为有解释吗?

mysql insert-update
2个回答
6
投票

使用ON DUPLICATE KEY UPDATE时,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则每行受影响的行值为2;如果现有行设置为其当前值,则每行受影响的行值为0。如果在连接到mysqld时为mysql_real_connect()C API函数指定CLIENT_FOUND_ROWS标志,则如果将现有行设置为其当前值,则affected-rows值为1(不为0)。

- https://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html


2
投票

这是我最近在MySQL 5.7中发现的一件有趣的事情。如果您故意尝试在重复键更新时插入已存在的行,则此查询还将复制受影响的行数。

例如,运行以下查询:

CREATE TABLE int_0 (
 id INT NOT NULL AUTO_INCREMENT,
 VALUE INT DEFAULT 0,
 PRIMARY KEY (id) 
);

INSERT INTO int_0 VALUES(1, NULL) ON DUPLICATE KEY UPDATE VALUE = NULL;

然后运行:

INSERT INTO int_0 VALUES(1, 2) ON DUPLICATE KEY UPDATE VALUE = 2;

此查询将显示“2行受影响”,即使表中只有1行,因此不可能影响2行。

我的理论是它试图计算受插入和更新影响的行数,然后将它们加在一起。不知何故被触发的ON DUPLICATE KEY UPDATE被计入一行被插入物'影响'。我相信这是你所看到的行为。

© www.soinside.com 2019 - 2024. All rights reserved.