Cập nhật:Câu trả lời này bao gồm phân loại lỗi chung. Để có câu trả lời cụ thể hơn về cách xử lý tốt nhất truy vấn chính xác của OP, vui lòng xem các câu trả lời khác cho câu hỏi này
Trong MySQL, bạn không thể sửa đổi cùng một bảng mà bạn sử dụng trong phần CHỌN.
Hành vi này được ghi lại tại:http://dev.mysql.com/doc/refman/5.6/en/update.html
Có thể bạn chỉ có thể tham gia vào bàn chơi của chính mình
Nếu logic đủ đơn giản để định hình lại truy vấn, hãy mất truy vấn con và nối bảng với chính nó, sử dụng các tiêu chí lựa chọn thích hợp. Điều này sẽ khiến MySQL coi bảng là hai thứ khác nhau, cho phép các thay đổi mang tính hủy diệt tiếp tục.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Ngoài ra, hãy thử lồng truy vấn con sâu hơn vào mệnh đề from ...
Nếu bạn thực sự cần truy vấn con, có một cách giải quyết, nhưng lý do là vì một số lý do, bao gồm cả hiệu suất:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Truy vấn con lồng nhau trong mệnh đề FROM tạo ra một bảng tạm thời ngầm định , vì vậy nó không được tính là cùng một bảng mà bạn đang cập nhật.
... nhưng hãy chú ý đến trình tối ưu hóa truy vấn
Tuy nhiên, hãy cẩn thận rằng từ MySQL 5.7 .6
và trở đi, trình tối ưu hóa có thể tối ưu hóa truy vấn con, và vẫn đưa ra lỗi cho bạn. May mắn thay, optimizer_switch
biến có thể được sử dụng để tắt hành vi này; mặc dù tôi không thể khuyên bạn nên làm điều này như một biện pháp khắc phục ngắn hạn hoặc cho các nhiệm vụ nhỏ một lần.
SET optimizer_switch = 'derived_merge=off';
Cảm ơn Peter V. Mørch cho lời khuyên này trong các nhận xét.
Kỹ thuật ví dụ từ Baron Schwartz, được xuất bản ban đầu tại Nabble , được diễn giải và mở rộng tại đây.