Помислете за
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Ако a и b са UNIQUE
полета, UPDATE
се случва на a = 1 OR b = 2
. Също така, когато условие a = 1 OR b = 2
се среща от два или повече записа, актуализирането се извършва само веднъж.
Ето тук таблица с идентификатор и име UNIQUE
полета
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Ако заявката е
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
тогава получаваме
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
което нарушава уникалността на Id и Name. Сега с
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
получаваме
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
Поведението на няколко клавиша е следното
UPDATE
в ON DUPLICATE KEY UPDATE
се изпълнява, ако един от UNIQUE
поле е равно на стойността, която трябва да се вмъкне. Тук UPDATE
се изпълнява на Id = 1 OR Name = C
. Това е еквивалентно на
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
Ами ако искам само една актуализация за всеки ключ
Може да използва UPDATE
изявление с LIMIT
ключова дума
UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
което ще даде
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
Ами ако искам една актуализация само ако стойностите и за двата ключа съвпадат
Едно решение е ALTER TABLE
и направете PRIMARY KEY
(или уникалност) работят и в двете полета.
ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Сега, на
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
получаваме
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
тъй като не е намерен дубликат (и на двата ключа).