Обновление: Этот ответ охватывает общую классификацию ошибок. Более конкретный ответ о том, как лучше всего обрабатывать точный запрос 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
Кроме того, попробуйте вложенность подзапроса глубже в с п ...
Если вы абсолютно необходим подзапросом, есть обходной путь, но это уродливого по нескольким причинам, в том числе производительности:
UPDATE tbl SET col = (
SELECT ... FROM (SELECT.... FROM) AS x);
вложенный подзапрос в ЕКЕ создает неявный временный таблицу, поэтому он не считается той же таблицей, которую вы обновляете.
... но следить за оптимизатором запросов
Однако нужно учитывать, что от MySQL 5.7.6 и вперед, оптимизатор может оптимизировать из подзапроса, и еще дать вам ошибку. К счастью, переменная optimizer_switch
может использоваться для отключения этого поведения; хотя я не мог рекомендовать делать это как нечто большее, чем краткосрочное исправление, или для небольших одноразовых задач.
SET optimizer_switch = 'derived_merge=off';
Благодаря Peter V. Mørch для этого совета в комментариях.
Пример техники от Барона Шварца, originally published at Nabble, перефразированный и расширенный здесь.
Связанный: http://stackoverflow.com/a/14302701/238419 – 2013-02-22 18:10:06
Похоже запрос функции в отслеживателе ошибок MySQL находится здесь: [не может обновить таблицу и выбрать из той же таблицы в подзапросе] (https: //bugs.mys ql.com/bug.php?id=23353) – 2017-12-30 06:32:26