Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Fehler 1093 – Die Zieltabelle für die Aktualisierung kann nicht in der FROM-Klausel angegeben werden

Update:Diese Antwort deckt die allgemeine Fehlerklassifizierung ab. Eine genauere Antwort darauf, wie die exakte Abfrage des OP am besten gehandhabt wird, finden Sie in den anderen Antworten auf diese Frage

In MySQL können Sie nicht dieselbe Tabelle ändern, die Sie im SELECT-Teil verwenden.
Dieses Verhalten ist dokumentiert unter:http://dev.mysql.com/doc/refman/5.6/en/update.html

Vielleicht können Sie den Tisch einfach mit sich selbst verbinden

Wenn die Logik einfach genug ist, um die Abfrage neu zu gestalten, verlieren Sie die Unterabfrage und verbinden Sie die Tabelle mit sich selbst, indem Sie geeignete Auswahlkriterien verwenden. Dies wird MySQL veranlassen, die Tabelle als zwei verschiedene Dinge zu sehen, wodurch destruktive Änderungen vorgenommen werden können.

UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col

Versuchen Sie alternativ, die Unterabfrage tiefer in eine from-Klausel zu verschachteln ...

Wenn Sie die Unterabfrage unbedingt benötigen, gibt es eine Problemumgehung, die jedoch aus mehreren Gründen, einschließlich der Leistung, ungeeignet ist:

UPDATE tbl SET col = (
  SELECT ... FROM (SELECT.... FROM) AS x);

Die verschachtelte Unterabfrage in der FROM-Klausel erstellt eine implizite temporäre Tabelle , also zählt es nicht als dieselbe Tabelle, die Sie aktualisieren.

... aber achten Sie auf den Abfrageoptimierer

Beachten Sie jedoch, dass von MySQL 5.7 .6 und weiter kann der Optimierer die Unterabfrage optimieren und trotzdem den Fehler anzeigen. Zum Glück der optimizer_switch Variable kann verwendet werden, um dieses Verhalten abzuschalten; obwohl ich dies nur als kurzfristige Lösung oder für kleine einmalige Aufgaben empfehlen kann.

SET optimizer_switch = 'derived_merge=off';

Dank an Peter V. Mørch für diesen Rat in den Kommentaren.

Die Beispieltechnik stammt von Baron Schwartz, ursprünglich bei Nabble veröffentlicht , hier paraphrasiert und erweitert.