Overweeg
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Als a en b UNIQUE
zijn velden, UPDATE
komt voor op a = 1 OR b = 2
. Ook wanneer voorwaarde a = 1 OR b = 2
wordt voldaan door twee of meer vermeldingen, wordt de update slechts één keer uitgevoerd.
Ex hier tabel tabel met ID en naam UNIQUE
velden
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Als de vraag is
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
dan krijgen we
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
die de uniciteit van ID en naam schendt. Nu met
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
we krijgen
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Het gedrag op meerdere toetsen is het volgende
UPDATE
in ON DUPLICATE KEY UPDATE
wordt uitgevoerd als een van de UNIQUE
veld gelijk is aan de in te voegen waarde. Hier, UPDATE
wordt uitgevoerd op Id = 1 OR Name = C
. Het is gelijk aan
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
Wat als ik slechts één update wil, voor beide sleutels
Kan UPDATE
gebruiken statement met LIMIT
zoekwoord
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
wat zal geven
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Wat als ik slechts één update wil als de waarden voor beide sleutels overeenkomen
Een oplossing is om ALTER TABLE
en maak de PRIMARY KEY
(of uniciteit) werken op beide velden.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Nu, op
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
we krijgen
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
aangezien er geen duplicaat (op beide sleutels) is gevonden.