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.