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.