Rozważ
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Jeśli a i b są UNIQUE
pola, UPDATE
występuje na a = 1 OR b = 2
. Również wtedy, gdy warunek a = 1 OR b = 2
zostanie spełniony przez dwa lub więcej wpisów, aktualizacja jest wykonywana tylko raz.
Np. tabela tabeli z identyfikatorem i nazwą UNIQUE
pola
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Jeśli zapytanie to
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
wtedy dostajemy
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
co narusza unikalność identyfikatora i nazwy. Teraz z
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
otrzymujemy
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Zachowanie na wielu klawiszach jest następujące
UPDATE
w ON DUPLICATE KEY UPDATE
jest wykonywany, jeśli jeden z UNIQUE
pole jest równe wartości do wstawienia. Tutaj UPDATE
jest wykonywany na Id = 1 OR Name = C
. Jest to odpowiednik
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
A jeśli chcę tylko jednej aktualizacji dla każdego klucza
Może użyć UPDATE
oświadczenie z LIMIT
słowo kluczowe
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
co da
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Co zrobić, jeśli chcę tylko jednej aktualizacji, jeśli wartości obu kluczy są zgodne
Jednym z rozwiązań jest ALTER TABLE
i utwórz PRIMARY KEY
(lub unikatowość) działają na obu polach.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Teraz w dniu
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
otrzymujemy
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
ponieważ nie znaleziono duplikatu (na obu klawiszach).