Заявката е неуспешна, защото не можете да промените таблица и да изберете от същата таблица в подзаявка.
Вижте Синтаксис на подзаявка
Мисля, че можете да заобиколите това с някои JOIN трикове:
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
Не съм експерт по MySQL, но вярвам, че това работи, защото MySQL първо обработва подзаявката и съхранява резултата в паметта като временна таблица, която не се променя по време на UPDATE. Страничен ефект от това е, че ако резултатът от подзаявката е голям, тогава ще сдъвчете тон (или ще свършите) памет.
Единственият начин (доколкото знам) да заобиколите проблема с паметта е да намалите подзаявката, като използвате критерии, които не са пряко свързани с целта за актуализиране. Например, ако трябва да правите тези актуализации като част от еженощен процес, накарайте вътрешния SELECT да връща само редове, създадени през последните ~24 часа.