Je ne parviens pas à faire fonctionner certaines sous-requêtes sur une UPDATE
. J'essaie quelque chose comme ce qui suit:
UPDATE foo
SET bar=bar-1
WHERE baz=
(
SELECT baz
FROM foo
WHERE fooID='1'
)
Où foo
est le nom de la table avec la clé primaire fooID
. bar
et baz
sont de type INT. En exécutant ceci, j'obtiens l'erreur suivante:
Error: A query failed. You can't specify target table 'foo' for update
in FROM clause
De cet article article web
Cette erreur est due au fait que MySQL n'autorise pas les mises à jour d'une table lorsque vous utilisez également cette même table dans une sélection interne comme critère de mise à jour . L'article propose une solution consistant à utiliser une table temporaire.
En utilisant cet exemple, votre mise à jour devrait être la suivante:
update foo
set bar = bar - 1
where baz in
(
select baz from
(
select baz
from foo
where fooID = '1'
) as arbitraryTableName
)
En raison de l'erreur 1093 Erreur 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 . La solution consiste à créer une table temporaire.
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;
Dans certains cas, vous pouvez également tirer parti de la variable MySQL. par exemple.:
SET @id1 = (SELECT id FROM foo WHERE name = 'parent');
UPDATE foo SET parent_id = @id1 WHERE name = 'emails';
Autant que je sache, lors de la mise à jour d'une table, Mysql la verrouille afin d'effectuer une mise à jour en toute sécurité. Vous ne pouvez pas sélectionner des données et mettre à jour le même tableau que vous essayez.
Ces textes devraient vous aider