我创建的表的列的默认值为'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上进行了检查
对此行为有解释吗?
答案 0 :(得分:6)
使用ON DUPLICATE KEY UPDATE,如果将行作为新行插入,则每行的受影响行值为 1 ,如果更新了现有行,则为 2 ,和 0 (如果现有行设置为当前值)。如果在连接到mysqld时为mysql_real_connect()C API函数指定CLIENT_FOUND_ROWS标志,并且将现有行设置为当前值,则受影响的行值为1(而不是0)。
-https://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html
答案 1 :(得分: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;
即使表中只有1行,此查询仍将显示“受影响的2行”,因此不可能影响2行。
我的理论是,它试图计算受插入和更新影响的行数,然后将它们加在一起。某种程度上被触发的ON DUPLICATE KEY UPDATE
被算作插入“影响”了一行。我相信这就是您所看到的行为。