Das Problem, dass die FROM-Klausel in der MySQL UPDATE-Anweisung auf dieselbe Tabelle verweist
Szene:
Stellen Sie sich eine MySQL-Tabelle mit dem Namen pers
vor:
<code class="language-sql">CREATE TABLE IF NOT EXISTS `pers` ( `persID` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(35) NOT NULL, `gehalt` int(11) NOT NULL, `chefID` int(11) DEFAULT NULL, PRIMARY KEY (`persID`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; INSERT INTO `pers` (`persID`, `name`, `gehalt`, `chefID`) VALUES (1, 'blb', 1000, 3), (2, 'as', 1000, 3), (3, 'chef', 1040, NULL);</code>
Frage:
Der Versuch, die folgende UPDATE-Anweisung auszuführen, führt zu Fehler 1093:
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR gehalt < 1000);</code>
Grund:
Dieser Fehler tritt auf, weil MySQL in UPDATE/INSERT/DELETE-Abfragen keinen Verweis auf die Zieltabelle aus einer Unterabfrage zulässt.
Lösung:
Um dieses Problem zu lösen, muss die Unterabfrage neu geschrieben werden, um die erforderlichen Felder in der Zieltabelle explizit in die temporäre Tabelle zu kopieren. Dies kann erreicht werden, indem die Instanz der Zieltabelle durch (SELECT * FROM target_table)
ersetzt wird. Die Unterabfrage wird in diesem Beispiel jedoch nicht benötigt und kann direkt geändert werden.
Richtige Abfrage:
<code class="language-sql">UPDATE pers P SET P.gehalt = P.gehalt * 1.05 WHERE (P.chefID IS NOT NULL OR P.gehalt < 1000);</code>
Diese modifizierte Abfrage verwendet WHERE
direkt in der P.gehalt
-Klausel, um MySQL-Einschränkungen zu vermeiden und somit die pers
-Tabelle korrekt zu aktualisieren. Es müssen keine temporären Tabellen erstellt werden.
Das obige ist der detaillierte Inhalt vonWarum kann ich eine MySQL-Tabelle nicht mithilfe einer Unterabfrage aktualisieren, die in der FROM-Klausel auf dieselbe Tabelle verweist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!