Оновлення: Ця відповідь стосується загальної класифікації помилок. Для отримання більш конкретної відповіді про те, як найкраще впоратися з точним запитом ОП, будь ласка, дивіться інші відповіді на це питання
У MySQL ви не можете змінювати ту саму таблицю, яку ви використовуєте в частині SELECT.
Така поведінка задокументована на веб-сайті:
http://dev.mysql.com/doc/refman/5.6/uk/update.html
Можливо, ви можете просто приєднати стіл до себе
Якщо логіка досить проста, щоб переформувати запит, втрачайте підзапит та приєднуйтесь до таблиці до себе, використовуючи відповідні критерії вибору. Це призведе до того, що MySQL побачить таблицю як дві різні речі, що дозволить руйнувати деструктивні зміни.
UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col
Крім того, спробуйте вкласти підзапит глибше в пункт з ...
Якщо вам абсолютно потрібен підзапит, є рішення, але це некрасиво з кількох причин, включаючи продуктивність:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
Вкладений підзапит у пункті FROM створює неявну тимчасову таблицю , тому він не вважається тією ж таблицею, яку ви оновлювали.
... але стежте за оптимізатором запитів
Однак майте на увазі, що починаючи з MySQL 5.7.6 і далі, оптимізатор може оптимізувати підзапит і все-таки подати помилку. На щастя, optimizer_switch
змінна може бути використана для вимкнення такої поведінки; хоча я не міг рекомендувати робити це як щось більше, ніж короткострокове виправлення або для невеликих разових завдань.
SET optimizer_switch = 'derived_merge=off';
Дякую Петру В. Морчу за цю пораду в коментарях.
Приклад техніки був від барона Шварца, спочатку опублікованого в Nabble , перефразованого та поширеного тут.