Navigieren durch die DELETE-Anweisungs-Unterabfragebeschränkungen von MySQL
Die-Anweisung von DELETE
MySQL kann manchmal den Fehler „Sie haben einen Fehler in Ihrer SQL-Syntax …“ auslösen, wenn sie mit einer Unterabfrage in der WHERE
-Klausel verwendet wird. Diese Einschränkung ergibt sich aus den Einschränkungen von MySQL hinsichtlich der Referenzierung der Zieltabelle innerhalb der Unterabfrage.
Illustrativer Abfrage- und Syntaxfehler
Untersuchen wir eine Abfrage, die darauf ausgelegt ist, Einträge aus der Tabelle term_hierarchy
basierend auf einer Unterabfragebedingung zu löschen:
<code class="language-sql">DELETE FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT DISTINCT(th1.tid) FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015 );</code>
Diese Abfrage schlägt fehl, weil MySQL die Verwendung der zu löschenden Tabelle (term_hierarchy
) innerhalb der WHERE
-Klausel der Unterabfrage nicht zulässt.
Lösung: Verschachtelte Unterabfragen
Die Lösung liegt in der Verschachtelung der Unterabfrage:
<code class="language-sql">DELETE FROM term_hierarchy AS th WHERE th.parent = 1015 AND th.tid IN ( SELECT id FROM (SELECT DISTINCT(th1.tid) AS id FROM term_hierarchy AS th1 INNER JOIN term_hierarchy AS th2 ON (th1.tid = th2.tid AND th2.parent != 1015) WHERE th1.parent = 1015) x );</code>
Erläuterung der Lösung
Durch Kapselung der ursprünglichen Unterabfrage (SELECT DISTINCT(th1.tid)
) in einer anderen Unterabfrage (SELECT id FROM (...)
) erstellen wir eine temporäre, abgeleitete Tabelle (x
). MySQL kann diese temporäre Tabelle dann sicher in der DELETE
-Klausel der WHERE
-Anweisung verwenden und so die ursprüngliche Einschränkung effektiv umgehen.
Zusammenfassung
Während MySQL die Verwendung von Unterabfragen in DELETE
-Anweisungen einschränkt, bietet diese Technik mit verschachtelten Unterabfragen eine praktische Problemumgehung für die Durchführung komplexer Löschvorgänge, die andernfalls durch Standardsyntaxregeln blockiert würden.
Das obige ist der detaillierte Inhalt vonWie kann man die Unterabfragebeschränkungen der DELETE-Anweisung von MySQL umgehen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!