Överväg
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Om a och b är UNIQUE
fält, UPDATE
förekommer på a = 1 OR b = 2
. Även när villkoret a = 1 OR b = 2
uppfylls av två eller flera poster, uppdatering görs endast en gång.
Ex här tabelltabell med Id och Namn UNIQUE
fält
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Om frågan är
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
då får vi
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
som bryter mot unika ID och namn. Nu med
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
vi får
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Beteende på flera nycklar är följande
UPDATE
i ON DUPLICATE KEY UPDATE
utförs om någon av UNIQUE
fältet är lika med värdet som ska infogas. Här, UPDATE
utförs på Id = 1 OR Name = C
. Det motsvarar
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
Vad händer om jag bara vill ha en uppdatering, för någon av tangenterna
Kan använda UPDATE
uttalande med LIMIT
sökord
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
som kommer att ge
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Vad händer om jag bara vill ha en uppdatering om värdena för båda nycklarna matchas
En lösning är att ALTER TABLE
och gör PRIMARY KEY
(eller unika) arbete på båda områdena.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Nu, på
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
vi får
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
eftersom ingen dubblett (på båda nycklarna) hittas.