Zvažte
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Pokud a a b jsou UNIQUE
pole, UPDATE
vyskytuje se na a = 1 OR b = 2
. Také když podmínka a = 1 OR b = 2
je splněna dvěma nebo více položkami, aktualizace se provede pouze jednou.
Příklad zde tabulka tabulky s ID a názvem UNIQUE
pole
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Pokud je dotaz
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
pak dostaneme
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
což porušuje jedinečnost Id a Name. Nyní s
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
dostáváme
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Chování na více klávesách je následující
UPDATE
v ON DUPLICATE KEY UPDATE
se provede, pokud jeden z UNIQUE
pole se rovná hodnotě, která má být vložena. Zde UPDATE
se provádí na Id = 1 OR Name = C
. Je ekvivalentní k
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
Co když chci pouze jednu aktualizaci pro kterýkoli klíč
Lze použít UPDATE
příkaz s LIMIT
klíčové slovo
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
který dá
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Co když chci jednu aktualizaci, pouze pokud se hodnoty pro oba klíče shodují
Jedním z řešení je ALTER TABLE
a vytvořte PRIMARY KEY
(nebo jedinečnost) práce na obou polích.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Nyní, na
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
dostáváme
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
protože nebyl nalezen žádný duplikát (na obou klíčích).