Dlaczego moje „INSERT… ON DUPLICATE KEY UPDATE” ma wpływ na 2 wiersze?

91

Robię INSERT ... ON DUPLICATE KEY UPDATEza a PRIMARY KEYw poniższej tabeli:

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

Jednak mimo że te wartości powinny być unikalne, widzę zmiany w 2 wierszach.

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)

Dlaczego to się dzieje?

EDYTOWAĆ

Dla porównania zobacz to zapytanie:

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
źródło
Dlaczego w pierwszej kolejności masz dwa klucze podstawowe?
Pekka,
1
@Pekka, PRIMARY KEYto pojedynczy pakiet utworzony w dniu, (uid, iid)ponieważ większość zapytań zostanie uruchomionych, gdy znane są obie wartości.
Josh Smith
1
@Josh widzę. Instrukcja wydaje się zniechęcać go jednak: In general, you should try to avoid using an ON DUPLICATE KEY UPDATE clause on tables with multiple unique indexes.Czy trzeba być klucz podstawowy? Dlaczego nie normalny indeks?
Pekka,
@Pekka, szczerze mówiąc nie jestem pewien. Nadal jestem w tym stosunkowo nowy. Czy indeks ma w tym przypadku większy sens?
Josh Smith
3
@Josh tak, normalny indeks obejmujący obie kolumny powinien tutaj działać dobrze
Pekka

Odpowiedzi:

201

Z instrukcji :

W przypadku AKTUALIZACJI KLUCZA DUPLIKATU wartość wierszy, których to dotyczy, na wiersz wynosi 1, jeśli wiersz zostanie wstawiony jako nowy wiersz i 2, jeśli zaktualizowany zostanie istniejący wiersz.

ChristopheD
źródło
15
I 0, jeśli istniejący wiersz ma ustawione bieżące wartości.
Svish
1
@Svish, dzięki! To jest naprawdę pomocne.
Zielony
2
Zastanawiam się tylko, jakie byłoby uzasadnienie tego… oczywiście, mógł zostać zwrócony jako kod odpowiedzi zamiast liczby zmienionych wierszy, aby uczynić go mniej zagmatwanym
Sudip Bhandari
...: |. Czy istnieje sposób na określenie faktycznej liczby wierszy, których to dotyczy? Nawet jeśli istniejący wiersz zostanie zaktualizowany, nadal dotyczy to tylko jednego wiersza
Ulad Kasach,
Czy to samo dotyczy wkładek wsadowych? … VALUES (2, 2, 'like'), (3, 3, 'like'), (4, 4, 'like') ON DUPLICATE …
luckydonald