Mengapa 2 baris terpengaruh dalam `INSERT… ON DUPLICATE KEY UPDATE` saya?

91

Saya melakukan INSERT ... ON DUPLICATE KEY UPDATEuntuk a PRIMARY KEYdi tabel berikut:

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

Namun, meskipun nilai ini harus unik, saya melihat 2 baris terpengaruh.

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)

Mengapa ini terjadi?

EDIT

Sebagai perbandingan, lihat kueri ini:

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
Josh Smith
sumber
Mengapa Anda memiliki dua kunci utama?
Pekka
1
@Pekka, PRIMARY KEYadalah pk tunggal yang dibuat(uid, iid) karena sebagian besar kueri akan dijalankan saat kedua nilai diketahui.
Josh Smith
1
@Hosh saya mengerti. The pengguna tampaknya untuk mencegah hal itu meskipun: In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.Apakah itu perlu menjadi kunci utama? Mengapa bukan indeks normal?
Pekka
@Pekka, sejujurnya tidak yakin. Saya masih relatif baru dalam hal ini. Apakah indeks lebih masuk akal dalam kasus ini?
Josh Smith
3
@Josh yup, indeks normal yang mencakup kedua kolom akan berfungsi dengan baik di sini
Pekka

Jawaban:

201

Dari manual :

Dengan ON DUPLICATE KEY UPDATE, nilai baris yang terpengaruh per baris adalah 1 jika baris disisipkan sebagai baris baru dan 2 jika baris yang ada diperbarui.

ChristopheD
sumber
15
Dan 0 jika baris yang ada disetel ke nilai saat ini.
Svish
1
@Svish, Terima kasih! Ini sangat membantu.
Hijau
2
Saya hanya ingin tahu apa alasan di baliknya .. jelas, itu bisa dikembalikan sebagai kode respons alih-alih jumlah baris yang terpengaruh untuk membuatnya kurang membingungkan
Sudip Bhandari
...: |. Apakah ada cara untuk menentukan sebenarnya jumlah baris yang dipengaruhi? Meskipun baris yang ada diperbarui, hanya ada satu baris yang terpengaruh
Ulad Kasach
Apakah ini juga sama untuk sisipan batch? … VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
luckydonald