Frågan misslyckas eftersom du inte kan ändra en tabell och välja från samma tabell i en underfråga.
Jag tror att du kan komma runt detta med lite JOIN-trick:
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
Jag är ingen MySQL-expert, men jag tror att detta fungerar eftersom MySQL bearbetar underfrågan först och lagrar resultatet i minnet som en tillfällig tabell, som inte ändras under UPPDATERING. En bieffekt av detta är att om resultatet av underfrågan är stort, kommer du att tugga upp massor av (eller få slut på) minne.
Det enda sättet (såvitt jag vet) att komma runt minnesproblemet är att minska underfrågan med hjälp av kriterier som inte är direkt relaterade till uppdateringsmålet. Om du till exempel skulle göra dessa uppdateringar som en del av en nattlig process, gör du att de inre SELECT endast returnerar rader som skapats under de senaste ~24 timmarna.