Forespørgslen mislykkes, fordi du ikke kan ændre en tabel og vælge fra den samme tabel i en underforespørgsel.
Jeg tror, du kan komme uden om dette med nogle JOIN-tricks:
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
Jeg er ingen MySQL-ekspert, men jeg tror, det virker, fordi MySQL behandler underforespørgslen først og gemmer resultatet i hukommelsen som en midlertidig tabel, som ikke ændres under OPDATERING. En bivirkning af dette er, at hvis resultatet af underforespørgslen er stort, så vil du tygge et væld af (eller løbe tør for) hukommelse.
Den eneste måde (så vidt jeg ved) at komme uden om hukommelsesproblemet er at nedskære underforespørgslen ved at bruge kriterier, der ikke er direkte relateret til opdateringsmålet. Hvis du f.eks. skulle lave disse opdateringer som en del af en natlig proces, skal du få den indre SELECT til kun at returnere rækker, der er oprettet inden for de seneste ~24 timer.