Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Comportamento do MySQL de ON DUPLICATE KEY UPDATE para vários campos UNIQUE


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.