Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum funktioniert dieses MySQL-Update nicht?

Die Abfrage schlägt fehl, weil Sie eine Tabelle nicht ändern und in einer Unterabfrage aus derselben Tabelle auswählen können.

Siehe Unterabfragesyntax

Ich denke, Sie können dies mit einigen JOIN-Tricks umgehen:

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

Ich bin kein MySQL-Experte, aber ich glaube, das funktioniert, weil MySQL die Unterabfrage zuerst verarbeitet und das Ergebnis als temporäre Tabelle im Speicher speichert, die sich während des UPDATE nicht ändert. Ein Nebeneffekt davon ist, dass Sie, wenn das Ergebnis der Unterabfrage groß ist, eine Menge Speicher verbrauchen (oder Ihnen ausgehen).

Die einzige Möglichkeit (soweit ich weiß), das Speicherproblem zu umgehen, besteht darin, die Unterabfrage mithilfe von Kriterien zu reduzieren, die nicht direkt mit dem Aktualisierungsziel zusammenhängen. Wenn Sie diese Aktualisierungen beispielsweise als Teil eines nächtlichen Prozesses durchführen würden, lassen Sie das innere SELECT nur Zeilen zurückgeben, die in den letzten ~24 Stunden erstellt wurden.