2010-09-19 284 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

相關問題