Tại sao 2 hàng bị ảnh hưởng trong ʻINSERT… TRÊN CẬP NHẬT KHÓA DUPLICATE`?


91

Tôi đang làm một INSERT ... ON DUPLICATE KEY UPDATEcho một PRIMARY KEYtrong bảng sau:

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ị này phải là duy nhất, tôi 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 chuyện này đang xảy ra?

BIÊN TẬP

Để so sánh, hãy 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

Tại sao bạn có hai khóa chính ngay từ đầu?
Pekka

1
@Pekka, PRIMARY KEYlà một pk duy nhất đượ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ị đều được biết.
Josh Smith

1
@Josh, tôi hiểu rồi. Tuy nhiên, hướng dẫn sử dụng dường như không khuyến khích nó: In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.Nó 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?
Pekka

@Pekka, thành thật mà nói thì không chắc. Tôi vẫn còn tương đối mới với điều này. Một chỉ mục có ý nghĩa hơn trong trường hợp này không?
Josh Smith

3
@Josh yup, một chỉ mục bình thường bao gồm cả hai cột sẽ hoạt động tốt ở đây
Pekka

Câu trả lời:


201

Từ sách hướng dẫn :

Với CẬP NHẬT KHÓA KÉP BẬT, giá trị hàng bị ảnh hưởng trên 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.


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

1
@Svish, Cảm ơn! Điều này thực sự hữu ích.
Màu xanh lá cây

2
Tôi chỉ tự hỏi điều gì sẽ là lý do đằng sau nó .. rõ ràng, nó có thể đã được trả lại như mã phản hồi thay vì số hàng bị ảnh hưởng để làm cho nó ít gây nhầm lẫn
Sudip Bhandari

...: |. Có cách nào để xác định số hàng thực tế bị ảnh hưởng không? Ngay cả khi một hàng hiện có được cập nhật, vẫn chỉ có một hàng bị ảnh hưởng
Ulad Kasach

Điều này có giống nhau đối với chèn hàng loạt không? … VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
luckydonald

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.