Encontrei pessoas recomendando usar ON DUPLICATE KEY UPDATE
várias UPDATE
linhas usando uma única consulta. Infelizmente, ninguém parece estar usando SQL limpo (definindo uma chave primária óbvia id
e usando pelo menos duas linhas) e, portanto, não consegui confirmar o efeito em um grau satisfatório.
Presuma que todos os dados na tabela existem e que algumas das quantity
linhas serão diferentes:
INSERT INTO variations (id, name, quantity)
VALUES
(1, 'John', 4),
(2, 'Amy', 5),
(3, 'Elizabeth', 6)
ON DUPLICATE KEY UPDATE
id=VALUES(id),
name=VALUES(name),
quantity=VALUES(quantity);
Se as quantidades na tabela são 1, 2 e 3, então o que eu constituí é que a consulta acima deve UPDATE
ser 4, 5 e 6. No entanto, a execução manual do comando retorna Affected rows: 0
e os dados no meu aplicativo estão, sem dúvida, não mudando .
Esclarecimentos:
- As
name
linhas podem ter seus valores alterados, estou tentando manter o código simples. - A
id
é a chave primária e não há outras chaves. - Não
UPDATE
precisa acontecer se todos os dados de toda a linha forem os mesmos entre a consulta e a linha da tabela. - Às vezes, apenas uma coluna de dados pode ser alterada, às vezes, todas as colunas, exceto,
id
podem ser alteradas. - Não há esclarecimento sobre
VALUES()
se ele está usando os dados$row
(por exemplo, do PHP) ouUPDATE
se difere do que já está na linha. - Não há esclarecimento sobre se todas as colunas devem ser especificadas (além da chave primária ou única).
- A documentação do MariaDB e do MySQL deixa uma nebulosa nuvem mística de incógnitas.
- Estou executando o MariaDB 10.2.6 (MySQL 5.5.5).
Estou tentado a despejar o código em um loop para executar uma UPDATE
consulta por linha , pois não tenho tempo para criar um projeto enorme com isso. Nenhum dos tópicos existentes aqui ou no SO aborda adequadamente o problema de consulta única de UPDATE múltipla (exemplos de uso case
parecem pesadelos monstruosos para construir) e, portanto, espero uma resposta que possa esclarecer isso sem qualquer dúvida, para que eu possa aprender com isso desafio frustrante.
Graças a #danblack e dbfiddle.uk em resumo, determinei que estava faltando uma das colunas no arquivo
ON DUPLICATE KEY UPDATE
.Cada coluna deve ser definida para
ON DUPLICATE KEY UPDATE
funcionar!Eu tinha colunas
id
,a
,b
,c
ed
na tabela. Esqueci de definir uma das colunas (não eraid
porque essa é a primeira metade do requisito).Não funcionará (coluna ausente):
Funcionará (tem todas as colunas da tabela):