it-swarm.com.de

MYSQL-Update mit WHERE SELECT-Unterabfragefehler

Ich habe ein Problem damit, ausgewählte Unterabfragen für die Bearbeitung einer UPDATE zu erhalten. Ich versuche so etwas wie das Folgende:

UPDATE foo
   SET bar=bar-1
 WHERE baz=
      (
       SELECT baz
       FROM foo
       WHERE fooID='1'
      )

Dabei ist foo der Tabellenname mit Primärschlüssel fooID. bar und baz sind vom Typ INT. Bei der Ausführung erhalte ich folgende Fehlermeldung:

Error: A query failed. You can't specify target table 'foo' for update 
in FROM clause
26
Erik

Aus diesem Webartikel

Der Grund für diesen Fehler ist, dass MySQL keine Aktualisierungen an einer Tabelle zulässt, wenn Sie dieselbe Tabelle auch in einem inneren Auswahlbereich als Aktualisierungskriterien verwenden. Der Artikel stellt eine Lösung vor, die eine temporäre Tabelle verwendet.

In diesem Beispiel sollte Ihr Update Folgendes sein:

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

Wegen Fehler 1093 Fehler 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 . Um dieses Problem zu umgehen, erstellen Sie eine temporäre Tabelle.

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

In einigen Fällen können Sie auch die MySQL-Variable nutzen. z.B.:

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

Soweit ich weiß, sperrt Mysql beim Aktualisieren einer Tabelle diese, um ein sicheres Update durchzuführen. Sie können keine Daten auswählen und dieselbe Tabelle aktualisieren, während Sie es versuchen.

Diese Texte sollten Ihnen helfen

0
P. R. Ribeiro