subselect - Actualización MYSQL con WHERE SELECT error de subconsulta
update mysql subselect (4)
Tengo un problema con la obtención de subconsultas seleccionadas para trabajar en una UPDATE
. Estoy intentando algo como lo siguiente:
UPDATE foo
SET bar=bar-1
WHERE baz=
(
SELECT baz
FROM foo
WHERE fooID=''1''
)
Donde foo
es el nombre de la tabla con la clave primaria fooID
. bar
y baz
son del tipo INT. Al ejecutar esto, aparece el siguiente error:
Error: A query failed. You can''t specify target table ''foo'' for update
in FROM clause
Debido al error 1093 Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000. El trabajo alrededor es crear una tabla temporal.
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;
Desde aquí: artículo web "El motivo de este error es que MySQL no permite actualizaciones en una tabla cuando también está utilizando esa misma tabla en una selección interna como sus criterios de actualización". El artículo continúa para proporcionar una solución, que es usar una tabla temporal.
Usando este ejemplo, su actualización debería ser esta:
update foo
set bar = bar - 1
where baz in
(
select baz from
(
select baz
from foo
where fooID = ''1''
) as arbitraryTableName
)
En algunos casos, también puede aprovechar la variable MySQL. p.ej:
SET @id1 = (SELECT id FROM foo WHERE name = ''parent'');
UPDATE foo SET parent_id = @id1 WHERE name = ''emails'';
Por lo que sé, al actualizar una tabla, Mysql la bloquea para realizar una actualización segura. No puede seleccionar datos y actualizar la misma tabla mientras intenta.
Esos textos deberían ayudarte