Wystarczy jedno kolizja indeksu, która naruszyłaby duplikat w celu aktualizacji wiersza, a nie w celu utworzenia nowego wiersza. Kolizja indeksów może być kluczem podstawowym, kluczem do innego indeksu, czy to w pojedynczej kolumnie, czy w indeksie złożonym w wielu kolumnach.
Przyznaję, że poniższy tekst jest dość kiepski, ale tak pomysłowy, jak tylko mogę teraz.
create table user
(
id int auto_increment primary key,
userName varchar(20) not null,
friendCount int not null,
unique key(userName)
);
insert user(userName,friendCount) values('Jason7',0) on duplicate key update friendCount=friendCount+1;
select * from user;
+----+----------+-------------+
| id | userName | friendCount |
+----+----------+-------------+
| 1 | Jason7 | 0 |
+----+----------+-------------+
insert user(userName,friendCount) values('Fred',0) on duplicate key update friendCount=friendCount+1;
select * from user;
+----+----------+-------------+
| id | userName | friendCount |
+----+----------+-------------+
| 1 | Jason7 | 0 |
| 2 | Fred | 0 |
+----+----------+-------------+
insert user(userName,friendCount) values('Fred',0) on duplicate key update friendCount=friendCount+1;
+----+----------+-------------+
| id | userName | friendCount |
+----+----------+-------------+
| 1 | Jason7 | 0 |
| 2 | Fred | 1 |
+----+----------+-------------+