sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué no funciona esta actualización de MySQL?

La consulta está fallando porque no puede modificar una tabla y seleccionar de esa misma tabla en una subconsulta.

Consulte Sintaxis de subconsultas

Creo que puedes solucionar esto con algunos trucos 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

No soy un experto en MySQL, pero creo que esto funciona porque MySQL procesa primero la subconsulta y almacena el resultado en la memoria como una tabla temporal, que no cambia durante la ACTUALIZACIÓN. Un efecto secundario de esto es que si el resultado de la subconsulta es grande, consumirá una tonelada de memoria (o se quedará sin ella).

La única forma (que yo sepa) de solucionar el problema de la memoria es reducir la subconsulta utilizando criterios que no están directamente relacionados con el objetivo de actualización. Por ejemplo, si hiciera estas actualizaciones como parte de un proceso nocturno, haga que el SELECT interno solo devuelva las filas creadas en las últimas ~24 horas.