Heim >Datenbank >MySQL-Tutorial >Warum kann ich eine MySQL-Tabelle nicht mithilfe einer Unterabfrage aktualisieren, die in der FROM-Klausel auf dieselbe Tabelle verweist?

Warum kann ich eine MySQL-Tabelle nicht mithilfe einer Unterabfrage aktualisieren, die in der FROM-Klausel auf dieselbe Tabelle verweist?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-22 19:47:13490Durchsuche

Why Can't I Update a MySQL Table Using a Subquery Referencing the Same Table in the FROM Clause?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn