Maison >base de données >tutoriel mysql >Comment contourner les restrictions de sous-requête de l'instruction DELETE de MySQL ?
Navigation dans les limitations de la sous-requête de l'instruction DELETE de MySQL
L'instruction DELETE
de MySQL peut parfois générer une erreur "Vous avez une erreur dans votre syntaxe SQL..." lorsqu'elle est utilisée avec une sous-requête dans la clause WHERE
. Cette limitation provient des restrictions de MySQL sur le référencement de la table cible dans la sous-requête.
Requête illustrative et erreur de syntaxe
Examinons une requête conçue pour supprimer des entrées de la table term_hierarchy
en fonction d'une condition de sous-requête :
<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>
Cette requête échoue car MySQL interdit l'utilisation de la table en cours de suppression (term_hierarchy
) dans la clause WHERE
de la sous-requête.
Résolution : sous-requêtes imbriquées
La solution réside dans l'imbrication de la sous-requête :
<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>
Explication de la solution
En encapsulant la sous-requête d'origine (SELECT DISTINCT(th1.tid)
) dans une autre sous-requête (SELECT id FROM (...)
), nous créons une table dérivée temporaire (x
). MySQL peut alors utiliser en toute sécurité cette table temporaire dans la clause DELETE
de l'instruction WHERE
, contournant ainsi la restriction d'origine.
Résumé
Bien que MySQL impose des restrictions sur l'utilisation des sous-requêtes dans les instructions DELETE
, cette technique de sous-requête imbriquée offre une solution de contournement pratique pour effectuer des opérations de suppression complexes qui seraient autrement bloquées par les règles de syntaxe standard.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!