Considerar
INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
Se a e b são
UNIQUE campos, UPDATE ocorre em a = 1 OR b = 2 . Também quando a condição a = 1 OR b = 2 é atendida por duas ou mais entradas, a atualização é feita apenas uma vez. Ex aqui tabela de tabela com Id e Nome
UNIQUE Campos Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
Se a consulta for
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7);
então nós obtemos
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
que viola a exclusividade de Id e Name. Agora com
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
Nós temos
Id Name Value
1 P 7
2 C 7
3 D 29
4 A 6
O comportamento em várias teclas é o seguinte
UPDATE em ON DUPLICATE KEY UPDATE é executado se um dos UNIQUE campo é igual ao valor a ser inserido. Aqui, UPDATE é executado em Id = 1 OR Name = C . É equivalente a UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C;
E se eu quiser apenas uma atualização, para qualquer chave
Pode usar
UPDATE instrução com LIMIT palavra-chave UPDATE table
SET Value = 7
WHERE Id = 1 OR Name = C
LIMIT 1;
que vai dar
Id Name Value
1 P 7
2 C 3
3 D 29
4 A 6
E se eu quiser uma atualização apenas se os valores de ambas as chaves corresponderem
Uma solução é
ALTER TABLE e faça a PRIMARY KEY (ou exclusividade) funcionam em ambos os campos. ALTER TABLE table
DROP PRIMARY KEY,
ADD PRIMARY KEY (Id, Name);
Agora
INSERT INTO table (Id, Name, Value)
VALUES (1, C, 7)
ON DUPLICATE KEY UPDATE Value = 7;
Nós temos
Id Name Value
1 P 2
2 C 3
3 D 29
4 A 6
1 C 7
uma vez que nenhuma duplicata (em ambas as chaves) é encontrada.