Подтвердить что ты не робот

Обновление MYSQL с ошибкой подзапроса WHERE 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
4b9b3361

Ответ 1

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

В этом примере ваше обновление должно быть следующим:

update foo
set bar = bar - 1
where baz in
(
  select baz from
  (
    select baz
    from foo
    where fooID = '1'
  ) as arbitraryTableName
)

Ответ 2

Из-за ошибки 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;

Ответ 3

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

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

Ответ 4

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

SET @id1 = (SELECT id FROM foo WHERE name = 'parent');
UPDATE foo SET parent_id = @id1 WHERE name = 'emails';