Обновление MYSQL с ошибкой подзапроса WHERE SELECT - PullRequest
26 голосов
/ 04 августа 2011

У меня проблема с получением подзапросов select для работы на UPDATE. Я пытаюсь что-то вроде следующего:

UPDATE foo
   SET bar=bar-1
 WHERE baz=
      (
       SELECT baz
       FROM foo
       WHERE fooID='1'
      )

Где foo - имя таблицы с первичным ключом fooID. bar и baz имеют тип INT. При выполнении этого я получаю следующую ошибку:

Error: A query failed. You can't specify target table 'foo' for update 
in FROM clause

Ответы [ 4 ]

53 голосов
/ 04 августа 2011

Из этой веб-статьи

Причина этой ошибки в том, что MySQL не разрешает обновления таблицы, когда вы также используете эту же таблицу во внутреннем выборе в качестве критериев обновления. Далее в статье предлагается решение, которое заключается в использовании временной таблицы.

Используя этот пример, ваше обновление должно быть таким:

update foo
set bar = bar - 1
where baz in
(
  select baz from
  (
    select baz
    from foo
    where fooID = '1'
  ) as arbitraryTableName
)
5 голосов
/ 04 августа 2011

Из-за ошибки 1093 Ошибка 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000. Обходной путь - создать временную таблицу.

CREATE TEMPORARY table foo_bak (SELECT baz from foo WHERE fooID='1');

UPDATE foo
  SET foo.bar=foo.bar-1
WHERE foo.baz =
  (
    SELECT baz
    FROM foo_bak
  );

DROP TABLE foo_bak;
0 голосов
/ 29 марта 2017

В некоторых случаях вы также можете использовать переменную MySQL.например:

SET @id1 = (SELECT id FROM foo WHERE name = 'parent');
UPDATE foo SET parent_id = @id1 WHERE name = 'emails';
0 голосов
/ 04 августа 2011

Насколько я знаю, при обновлении таблицы Mysql блокирует ее для безопасного обновления. Вы не можете выбрать данные и обновить ту же таблицу, что и вы.

Эти тексты должны помочь вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...