Overvej
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Hvis a og b er UNIQUE
felter, UPDATE
forekommer på a = 1 OR b = 2
. Også når betingelse a = 1 OR b = 2
er opfyldt af to eller flere poster, opdateres kun én gang.
Eks her tabeltabel med id og navn UNIQUE
felter
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Hvis forespørgslen er
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
så får vi
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
som krænker entydigheden af id og navn. 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
Adfærd på flere taster er følgende
UPDATE
i ON DUPLICATE KEY UPDATE
udføres, hvis en af UNIQUE
felt er lig med den værdi, der skal indsættes. Her UPDATE
udføres på Id = 1 OR Name = C
. Det svarer til
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
Hvad nu hvis jeg kun vil have én opdatering, for begge nøgler
Kan bruge UPDATE
sætning med LIMIT
søgeord
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
som vil give
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Hvad hvis jeg kun vil have én opdatering, hvis værdierne for begge nøgler matches
En løsning er at ALTER TABLE
og lav PRIMARY KEY
(eller unikke) arbejde på begge områder.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Nu videre
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
da der ikke findes nogen duplikat (på begge nøgler).