web-dev-qa-db-fra.com

Mise à jour de MYSQL avec une erreur de sous-requête WHERE SELECT

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'
      )

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
26
Erik

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
)
53
DwB

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;
5
ace

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';
0
Lukas Jelinek

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

0
P. R. Ribeiro