Zapytanie kończy się niepowodzeniem, ponieważ nie możesz zmodyfikować tabeli i wybrać z tej samej tabeli w podzapytaniu.
Zobacz Składnia podzapytań
Myślę, że można to obejść za pomocą sztuczek 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
Nie jestem ekspertem MySQL, ale wierzę, że to działa, ponieważ MySQL najpierw przetwarza podzapytanie i przechowuje wynik w pamięci jako tabela tymczasowa, która nie zmienia się podczas aktualizacji. Efektem ubocznym tego jest to, że jeśli wynik podzapytania jest duży, pożresz mnóstwo (lub zabraknie) pamięci.
Jedynym sposobem (o ile wiem) na obejście problemu z pamięcią jest zmniejszenie podzapytania przy użyciu kryteriów, które nie są bezpośrednio związane z celem aktualizacji. Na przykład, jeśli chcesz wykonać te aktualizacje jako część procesu nocnego, spraw, aby wewnętrzny SELECT zwracał tylko wiersze utworzone w ciągu ostatnich ~24 godzin.