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

Por que esta atualização do MySQL não funciona?


A consulta está falhando porque você não pode modificar uma tabela e selecionar dessa mesma tabela em uma subconsulta.

Consulte Sintaxe da subconsulta

Eu acho que você pode contornar isso com alguns truques de JOIN:
UPDATE meterreadings AS tgt
INNER JOIN (
  SELECT * FROM meterreadings
  WHERE meterreadingtype_id = 2
  ) AS src
ON tgt.meterreadingdate = src.meterreadingdate
   AND tgt.location_id = src.location_id
   AND tgt.created = src.created
   AND tgt.asset_id = src.asset_id
SET tgt.meterreading = src.meterreading

Não sou especialista em MySQL, mas acredito que isso funcione porque o MySQL processa a subconsulta primeiro e armazena o resultado na memória como uma tabela temporária, que não muda durante o UPDATE. Um efeito colateral disso é que, se o resultado da subconsulta for grande, você consumirá uma tonelada de (ou ficará sem) memória.

A única maneira (até onde eu sei) de contornar o problema de memória é reduzir a subconsulta usando critérios que não estão diretamente relacionados ao destino da atualização. Por exemplo, se você fizer essas atualizações como parte de um processo noturno, faça com que o SELECT interno retorne apenas as linhas criadas nas últimas 24 horas.