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

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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.