it-roy-ru.com

Обновление MYSQL с ошибкой подзапроса WHERE SELECT

У меня проблема с получением подзапросов 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
26
Erik

Из этого веб-статья

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

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

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

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

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

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

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

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

0
P. R. Ribeiro