为什么在我的`INSERT ... ON DUPLICATE KEY UPDATE`中影响了2行?

Jos*_*ith 82 mysql insert insert-update

我正在INSERT ... ON DUPLICATE KEY UPDATEPRIMARY KEY下表中的a 做一个:

DESCRIBE users_interests;
Run Code Online (Sandbox Code Playgroud)
+------------+---------------------------------+------+-----+---------+-------+
| Field      | Type                            | Null | Key | Default | Extra |
+------------+---------------------------------+------+-----+---------+-------+
| uid        | int(11)                         | NO   | PRI | NULL    |       |
| iid        | int(11)                         | NO   | PRI | NULL    |       |
| preference | enum('like','dislike','ignore') | YES  |     | NULL    |       |
+------------+---------------------------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

但是,即使这些值应该是唯一的,我也会看到2行受到影响.

INSERT INTO users_interests (uid, iid, preference) VALUES (2, 2, 'like')
ON DUPLICATE KEY UPDATE preference='like';
Run Code Online (Sandbox Code Playgroud)
Query OK, 2 rows affected (0.04 sec)
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

编辑

为了比较,请参阅此查询:

UPDATE users_interests SET preference='like' WHERE uid=2 AND iid=2;
Run Code Online (Sandbox Code Playgroud)
Query OK, 1 row affected (0.44 sec)
Rows matched: 1  Changed: 1  Warnings: 0
Run Code Online (Sandbox Code Playgroud)

Chr*_*heD 183

手册:

使用ON DUPLICATE KEY UPDATE时,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则每行受影响的行值为2.

  • 如果现有行设置为其当前值,则为0. (9认同)
  • 谢谢!很高兴在手册中看到它的参考. (4认同)
  • 我只是想知道它背后的基本原理是什么..显然,它可以作为响应代码而不是受影响的行数返回,以使其不那么混乱 (2认同)
  • 我想知道有多少像我一样的人浪费了 30 分钟试图找出更新了哪两行......结果却发现了这种对界面的神秘滥用。 (2认同)

ont*_*ack 7

所以你知道你是更新了一行(重复键)还是只是插入了一个:http : //dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html