De query mislukt omdat u een tabel niet kunt wijzigen en uit diezelfde tabel in een subquery kunt selecteren.
Zie Subquerysyntaxis
Ik denk dat je dit kunt omzeilen met wat JOIN-trucs:
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
Ik ben geen MySQL-expert, maar ik geloof dat dit werkt omdat MySQL eerst de subquery verwerkt en het resultaat in het geheugen opslaat als een tijdelijke tabel, die niet verandert tijdens de UPDATE. Een neveneffect hiervan is dat als het resultaat van de subquery groot is, je een hoop geheugen opslokt (of te weinig hebt).
De enige manier (voor zover ik weet) om het geheugenprobleem te omzeilen, is door de subquery te verkleinen met behulp van criteria die niet direct gerelateerd zijn aan het updatedoel. Als u deze updates bijvoorbeeld zou doen als onderdeel van een nachtelijk proces, laat de innerlijke SELECT dan alleen rijen retourneren die in de afgelopen ~24 uur zijn gemaakt.