Актуализация:Този отговор обхваща общата класификация на грешките. За по-конкретен отговор как най-добре да се справите с точната заявка на OP, моля, вижте други отговори на този въпрос
В MySQL не можете да модифицирате същата таблица, която използвате в частта SELECT.
Това поведение е документирано на:http://dev.mysql.com/doc/refman/5.6/en/update.html
Може би просто да присъедините масата към нея
Ако логиката е достатъчно проста, за да преоформите заявката, загубете подзаявката и присъединете таблицата към себе си, като използвате подходящи критерии за избор. Това ще накара MySQL да види таблицата като две различни неща, което ще позволи да продължат деструктивните промени.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Алтернативно, опитайте да вложите подзаявката по-дълбоко в клауза from ...
Ако абсолютно се нуждаете от подзаявката, има заобиколно решение, но това е грозно поради няколко причини, включително производителност:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Вложената подзаявка в клаузата FROM създава неявна временна таблица , така че не се брои за същата таблица, която актуализирате.
... но внимавайте за оптимизатора на заявки
Внимавайте обаче, че от MySQL 5.7 .6
и нататък, оптимизаторът може да оптимизира подзаявката и пак да ви даде грешката. За щастие, optimizer_switch
променливата може да се използва за изключване на това поведение; въпреки че не бих могъл да препоръчам да правите това като нещо повече от краткосрочна корекция или за малки еднократни задачи.
SET optimizer_switch = 'derived_merge=off';
Благодарение на Peter V. Mørch за този съвет в коментарите.
Примерната техника е от Baron Schwartz, първоначално публикуван в Nabble , перифразиран и разширен тук.