Обновление 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
Ответы
Ответ 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';