Ответ 1
Рассмотрим
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
выполняется двумя или более записями, обновление выполняется только один раз.
В следующей таблице таблицы с полями Id и Name 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
так как не найден дубликат (по обеим клавишам).