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


89

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

DESCRIBE users_interests;
+------------+---------------------------------+------+-----+---------+-------+
| 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    |       |
+------------+---------------------------------+------+-----+---------+-------+

但是,尽管这些值应该是唯一的,但我发现有2行受到影响。

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

为什么会这样呢?

编辑

为了进行比较,请参见以下查询:

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

为什么首先要有两个主键?
佩卡

1
@Pekka,PRIMARY KEY是在单个pk上创建的,(uid, iid)因为大多数查询将在两个值都已知时运行。
乔什·史密斯

1
@Josh,我明白了。但是,该手册似乎并不鼓励它:In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.它是否需要为主键?为什么不是正常索引?
佩卡·

@Pekka,老实说不确定。我对此还比较陌生。在这种情况下,索引是否更有意义?
乔什·史密斯

3
@Josh yup,跨越两列的普通索引在这里应该可以正常工作
Pekka 2010年

Answers:


198

手册

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


14
如果现有行设置为其当前值,则为0。
Svish

1
@Svish,谢谢!这真的很有帮助。
格林

1
我只是想知道它背后的原理是什么..显然,它可能已作为响应代码返回,而不是因为受影响的行数而减少了,以减少混乱
Sudip Bhandari,

...:|。有没有一种方法可以确定受影响的实际行数?即使现有的行更新,仍然只有一个行受影响
Ulad Kasach

批量插入件也一样吗?… VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
luckydonald

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.