Truy vấn không thành công vì bạn không thể sửa đổi một bảng và chọn từ chính bảng đó trong một truy vấn con.
Tôi nghĩ bạn có thể giải quyết vấn đề này bằng một số thủ thuật THAM GIA:
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
Tôi không phải là chuyên gia về MySQL, nhưng tôi tin rằng điều này hiệu quả vì MySQL xử lý truy vấn con trước tiên và lưu trữ kết quả trong bộ nhớ dưới dạng bảng tạm thời, bảng này không thay đổi trong quá trình CẬP NHẬT. Một tác dụng phụ của việc này là nếu kết quả của truy vấn con lớn, thì bạn sẽ tốn rất nhiều (hoặc hết) bộ nhớ.
Cách duy nhất (theo như tôi biết) để giải quyết vấn đề bộ nhớ là giảm bớt truy vấn con bằng cách sử dụng các tiêu chí không liên quan trực tiếp đến mục tiêu cập nhật. Ví dụ:nếu bạn thực hiện các cập nhật này như một phần của quy trình hàng đêm, hãy đặt SELECT bên trong chỉ trả về các hàng đã tạo trong ~ 24 giờ qua.