2010-09-19 34 views
70

tôi đang làm một INSERT ... ON DUPLICATE KEY UPDATE cho một PRIMARY KEY trong bảng sau:Tại sao 2 hàng bị ảnh hưởng trong `INSERT ... ON UPDATE DUPLICATE KEY UPDATE`?

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

Tuy nhiên, mặc dù các giá trị phải là duy nhất, tôi nhìn thấy 2 hàng bị ảnh hưởng.

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) 

Tại sao điều này xảy ra?

EDIT

Để so sánh, xem truy vấn này:

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

Tại sao bạn có hai khóa chính ở vị trí đầu tiên? –

+0

@Pekka, 'PRIMARY KEY' là một pk được tạo trên '(uid, iid)' vì hầu hết các truy vấn sẽ được chạy khi cả hai giá trị được biết. –

+0

@Josh tôi hiểu rồi. [Thủ công] (http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html) dường như không khuyến khích nó mặc dù: 'Nói chung, bạn nên cố gắng tránh sử dụng một ON DUPLICATE Mệnh đề KEY UPDATE trên các bảng có nhiều chỉ mục duy nhất.' Có cần phải là khóa chính không? Tại sao không phải là một chỉ số bình thường? –

Trả lời

155

Từ the manual:

Với ON UPPLICATE KEY UPDATE, giá trị hàng bị ảnh hưởng mỗi hàng là 1 nếu hàng được chèn dưới dạng hàng mới và 2 nếu hàng hiện có được cập nhật.

+4

Cảm ơn! Vui mừng khi thấy tham chiếu đến nó trong hướng dẫn sử dụng. –

+3

Và 0 nếu hàng hiện tại được đặt thành giá trị hiện tại của nó. – Svish

+0

@Svish, Cảm ơn! Điều này thực sự hữu ích. – Green

Các vấn đề liên quan