2010-09-19 286 views
70

我做的INSERT ... ON DUPLICATE KEY UPDATE为下表中PRIMARY KEY为什么我的'INSERT ... ON DUPLICATE KEY UPDATE'中有2行受到影响?

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 
+0

为什么你首先有两个主键? – 2010-09-19 20:28:52

+0

@Pekka,'PRIMARY KEY'是在'(uid,iid)'上创建的单个pk,因为大多数查询将在两个值都已知时运行。 – 2010-09-19 20:35:38

+0

@Josh我明白了。但[手册](http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html)似乎不鼓励它:'一般来说,你应该尽量避免使用ON DUPLICATE具有多个唯一索引的表上的KEY UPDATE子句。“它是否需要成为主键?为什么不是正常的索引? – 2010-09-19 20:35:44

回答

155

来自the manual

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

+4

谢谢!很高兴在手册中看到它的参考。 – 2010-09-19 20:34:30

+3

如果现有行被设置为其当前值,则为0。 – Svish 2017-02-03 22:40:41

+0

@Svish,谢谢!这真的很有帮助。 – Green 2017-06-05 00:10:29

相关问题