MySQL lässt nicht zu, dass SELECT FROM auf die für UPDATE verwendete Tabelle verweist, was manchmal verwirrend ist. Natürlich gibt es bessere Möglichkeiten, als endlose temporäre Tabellen zu erstellen. In diesem Artikel wird erläutert, wie Sie eine Tabelle aktualisieren und gleichzeitig SELECT in der Abfrageklausel verwenden.
Problembeschreibung
Angenommen, die Tabelle, die ich aktualisieren möchte, ist dieselbe Tabelle wie die Abfrageklausel Es gibt viele Gründe dafür, beispielsweise die Felder der Tabelle mit statistischen Daten zu aktualisieren (in diesem Fall müssen Sie die Gruppenklausel verwenden, um den statistischen Wert zurückzugeben), die Felder eines Datensatzes auf einen anderen Datensatz zu aktualisieren, ohne Nicht-Datensätze zu verwenden. Standardaussagen usw. Zum Beispiel:
Tafeläpfel erstellen (Sorte char(10) Primärschlüssel, Preis int);
Werte in Äpfel einfügen ('fuji', 5), ('gala', 6);
Äpfel aktualisieren
Preis festlegen = (Preis aus Äpfeln auswählen, wobei Sorte = 'gala')
wobei Sorte = 'fuji';
Die Fehlermeldung lautet: FEHLER 1093 (HY000): Sie können die Zieltabelle nicht angeben ' apples‘ for update in der FROM-Klausel. In der UPDATE-Dokumentation des MySQL-Handbuchs wird Folgendes erklärt: „Derzeit ist es nicht möglich, eine Tabelle zu aktualisieren und in einer Unterabfrage aus derselben Tabelle auszuwählen.“
In diesem Beispiel ist das Problem sehr einfach zu lösen. , aber manchmal muss man das Ziel über Abfrageklauseln aktualisieren. Zum Glück haben wir eine Lösung.
Lösung
Da MySQL verschachtelte Abfragen in der FROM-Klausel über temporäre Tabellen implementiert, kann das Laden der verschachtelten Abfrage in eine andere verschachtelte Abfrage dazu führen, dass die FROM-Klausel abgefragt und gespeichert wird. Alle werden in temporären Tabellen und dann indirekt ausgeführt in peripheren Abfragen referenziert werden. Die folgende Aussage ist korrekt:
Äpfel aktualisieren
Preis festlegen = (
Preis auswählen von (
* aus Äpfeln auswählen
) als x
wobei Sorte = 'gala')
wherevariate = 'fuji';
Das Obige ist der Inhalt der Methode, mit der die MySQL-Datenbank den Aktualisierungsvorgang während der Auswahl durchführt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn). )!