"INSERT… ON DUPLICATE ANAHTAR GÜNCELLEME" öğemde neden 2 satır etkileniyor?


91

Aşağıdaki tabloda bir INSERT ... ON DUPLICATE KEY UPDATEiçin bir yapıyorum PRIMARY 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    |       |
+------------+---------------------------------+------+-----+---------+-------+

Ancak, bu değerlerin benzersiz olması gerekse de, 2 satırın etkilendiğini görüyorum.

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)

Bu neden oluyor?

DÜZENLE

Karşılaştırma için şu sorguya bakın:

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

İlk başta neden iki birincil anahtarınız var?
Pekka

1
@Pekka, her iki değer de bilindiğinde çoğu sorgu çalıştırılacağı için PRIMARY KEYoluşturulan tek bir pk'dir (uid, iid).
Josh Smith

1
@Josh görüyorum. El kitabı yine de cesaretini kırıyor gibi görünüyor: In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.Birincil anahtar olması gerekiyor mu? Neden normal bir dizin değil?
Pekka

@Pekka, dürüst olmak gerekirse emin değilim. Bu konuda hala nispeten yeniyim. Bu durumda bir indeks daha mantıklı mıdır?
Josh Smith

3
@Josh yup, her iki sütunu kapsayan normal bir dizin burada iyi çalışacaktır
Pekka

Yanıtlar:


201

Gönderen manuel :

ON DUPLICATE KEY UPDATE ile, satır başına etkilenen satır değeri, satır yeni bir satır olarak eklenirse 1 ve mevcut bir satır güncellenmişse 2 olur.


15
Ve mevcut bir satır, mevcut değerlerine ayarlanmışsa 0.
Svish

1
@Svish, Teşekkürler! Bu gerçekten faydalıdır.
Yeşil

2
Sadece bunun arkasındaki mantık ne olurdu merak ediyorum .. açıkça, daha az kafa karıştırıcı hale getirmek için etkilenen satır sayısı yerine yanıt kodu olarak döndürülebilirdi
Sudip Bhandari

...: |. Etkilenen gerçek satır sayısını belirlemenin bir yolu var mı ? Mevcut bir satır güncellenmiş olsa bile, etkilenen yalnızca bir satır vardır
Ulad Kasach

Bu toplu uçlar için de aynı mı? … VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
luckydonald

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.