[MySQL] Requete composée avec delete

Salut, j’ai un léger problème avec une requête sql (pour changer).
Je m’explique :
j’ai une table inventaire. Dedans, chaque entrée a un champs pointeur et un champs pointeurup, qui peut soit être égal à 0, soit égal au champs id d’une autre entrée de cette table inventaire. Pour certaines raison, il peut arriver que le champs pointeur d’une des entrées pointe vers un id qui n’existe plus. C’est pourquoi je souhaiterais faire une requête pour effacer ces entrées.

J’ai donc commencé par tâtonner avec select et j’en suis arrivé à ça :

SQL
[color=blue;font-weight:bold]SELECT[/color] * FROM inventaire WHERE pointeur NOT IN ([color=blue;font-weight:bold]SELECT[/color] id FROM inventaire) AND pointeurup NOT IN ([color=blue;font-weight:bold]SELECT[/color] id FROM inventaire) AND (pointeur > 0 OR pointeurup > 0)

Je suppose qu’il y a possibilité de faire la même chose avec une seule sous-requête, mais ce n’est pas le problème pour le moment. Bref, cette requête renvoyant exactement ce que je cherche, j’ai essayé de faire un delete :

SQL
[color=blue;font-weight:bold]DELETE[/color] FROM inventaire WHERE pointeur NOT IN ([color=blue;font-weight:bold]SELECT[/color] id FROM inventaire) AND pointeurup NOT IN ([color=blue;font-weight:bold]SELECT[/color] id FROM inventaire) AND (pointeur > 0 OR pointeurup > 0)

Et là, pour une raison que j’ignore, la requête ne passe pas. Le message d’erreur renvoyé est : "#1093 - You can’t specify target table ‘inventaire’ for update in FROM clause "
Je dois avouer que je ne comprend pas trop le problème. Peut-être que je ne peux pas faire de sous-requête select avec la table sur laquelle je fais un delete ? Si quelqu’un peut m’éclairer… :slight_smile:

Saluton,
Ton diagnostic est probablement juste.
Je te suggère de créer par requête une table temporaire contenant les id et d’invoquer cette table dans tes sous-requêtes de la requête de suppression.

Heuu, désolé, mais la création de table temporaire, à part que ça consomme beaucoup de ressources, vaut mieux oublier, sauf rares exceptions…

Pour ma part, je ferais plutôt un UPDATE puis un DELETE. (Je pense même que dans ton cas un simple UPDATE à 0 suffirait)

Salut je ne connais que tres peu MYSQL mais je travaille depuis des années sur MSSQL( sqlserver)…

Je pense en effet que ton probleme viens des limite de Mysql qui ne doit pas gérer les requetes composées lors de delete ou update quand tes sous requetes ont pour cible la table qui subit l’UPDATE/INSERT.

En esperant que cela soit résolu dans le nouvelle version de mysql qui pointe le bout de son nez ( avec requete parametrées et procedures stockées entre autres…)
Peux tu nous detailler evasivement les caracteristiques de tes champs pointeur et pointeurUp