Mysql 为什么插入。。。重复密钥更新受影响的行报告2?

Mysql 为什么插入。。。重复密钥更新受影响的行报告2?,mysql,Mysql,如果我执行以下语句: INSERT INTO users(id, username) VALUES(102, 'test') ON DUPLICATE KEY UPDATE username='test'; 如果DB中存在列id的值,但username的值不同,则报告的受影响行数为2。更准确地说: 如果新记录完全重复,且未更新/插入任何内容,则受影响的行为0 如果id还不存在,则插入一条新记录,受影响的行为1 如果id存在,但已更新现有记录,则受影响行的值设置为2 这是什么原因?这是为了提

如果我执行以下语句:

INSERT INTO users(id, username) VALUES(102, 'test') ON DUPLICATE KEY UPDATE username='test';
如果DB中存在列
id
的值,但
username
的值不同,则报告的受影响行数为2。更准确地说:

  • 如果新记录完全重复,且未更新/插入任何内容,则受影响的行为0
  • 如果id还不存在,则插入一条新记录,受影响的行为1
  • 如果id存在,但已更新现有记录,则受影响行的值设置为2
这是什么原因?这是为了提供所采取行动的信息吗?实际上是否有两行受到影响

在MariaDB 10.3.7上使用

创建表(如果不存在)`users`(
`id`int(11)非空自动增量,
`用户名'varchar(355)不为空,
主键(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=103默认字符集=utf8mb4;
在'users'('id','username')值中插入(102,'Some name');

插入。。。在重复密钥更新时
执行两个操作。您可以使用将会话变量设置为副作用的触发器来演示这一点:

mysql> create trigger i before insert on users for each row set @i = true;

mysql> create trigger u before update on users for each row set @u = true;

mysql> INSERT INTO users(id, username) VALUES(102, 'test') ON DUPLICATE KEY UPDATE username='test';
Query OK, 2 rows affected (0.01 sec)

mysql> select @i, @u;
+------+------+
| @i   | @u   |
+------+------+
|    1 |    1 |
+------+------+

insert是受影响行中的第一行,update是第二行,它是否是同一行并不重要。