Maison > base de données > tutoriel mysql > Comment contourner les restrictions de sous-requête de l'instruction DELETE de MySQL ?

Comment contourner les restrictions de sous-requête de l'instruction DELETE de MySQL ?

Patricia Arquette
Libérer: 2025-01-10 18:17:10
original
476 Les gens l'ont consulté

How to Work Around MySQL's DELETE Statement Subquery Restrictions?

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 :

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
);
Copier après la connexion

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 :

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
);
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal