2009-09-06 9 views
0

Je suis en train de supprimer de plusieurs tables avec la requête suivanteMySQL supprimer plusieurs tables en utilisant ON ne fonctionne pas

mysql>   DELETE 
    ->   info, pagelets, shingles, links 
    ->   FROM 
    ->   info 
    ->   INNER JOIN pagelets 
    ->   ON info.page_key=144 
    ->   AND info.page_key=pagelets.page_key 
    ->   INNER JOIN shingles 
    ->   ON pagelets.pagelet_serial=shingles.pagelet_serial 
    ->   INNER JOIN links 
    ->   ON pagelets.pagelet_serial=links.pagelet_serial 
    -> ; 
Query OK, 2050 rows affected (0.08 sec) 

mysql> SELECT * FROM info; 
+--------+----------+ 
| netloc | page_key | 
+--------+----------+ 
|  1 |  2 | 
|  1 |  118 | 
+--------+----------+ 
2 rows in set (0.00 sec) 

mysql> SELECT * FROM pagelets WHERE page_key =144; 
+----------+----------------+ 
| page_key | pagelet_serial | 
+----------+----------------+ 
|  144 |   245 | 
|  144 |   246 | 
|  144 |   249 | 
|  144 |   253 | 

Malheureusement, cela ne fonctionne que sur un des liens de table et d'information. (Tknow « Don pourquoi il doens't travail sur pagelets et bardeaux)

La requête originale était:

#  DELETE 
#   info, pagelets, shingles, links 
#  FROM 
#   info INNER JOIN pagelets INNER JOIN shingles INNER JOIN links 
#  WHERE 
#   info.page_key=%(page_key)s 
#   AND info.page_key=pagelets.page_key 
#   AND pagelets.pagelet_serial=shingles.pagelet_serial 
#   AND pagelets.pagelet_serial=links.pagelet_serial 
# 

quelqu'un peut expliquer ce mystère?

+0

et la requête d'origine ne fonctionne pas (vous l'aurez probablement deviné) –

+0

Les données d'exemple que vous montrez n'ont pas de lignes correspondantes entre info et pagelets, il n'est donc pas étonnant que DELETE ne fonctionne pas. Je –

Répondre

0

Remplacez vos noms de table figurant à supprimer dans ce:

DELETE info.*, pagelets.*, shingles.*, links.* 
+0

essayé d'utiliser ceci:. SUPPRIMER info *, pagelets *, bardeaux *, liens * DE informations INNER JOIN pagelets SUR info.page_key = pagelets.page_key INNER JOIN bardeaux SUR pagelets.pagelet_serial... = shingles.pagelet_serial Liens INNER JOIN ON pagelets.pagelet_serial = links.pagelet_serial O WH info.page_key = 118 –

+0

Essayez la syntaxe "USING" en SQL pour la suppression de tables multiples – yoda

+0

@yoda: La syntaxe USING sera ambiguë et parce que plus de deux tables contiennent la colonne 'pagelet_serial'. Ceci est une erreur –

0

Une alternative plus propre serait d'utiliser les principales restrictions étrangères avec ON DELETE CASCADE dans ces tables dépendantes (pagelets, bardeaux, liens) de sorte que la déclaration de suppression doesn Pas besoin d'être si compliqué.

+0

La dose MYISAM ne prend pas en charge les clés étrangères –

0

Essayez cette requête comme une expérience:

SELECT * FROM info 
INNER JOIN pagelets ON (info.page_key = pagelets.page_key) 
LEFT JOIN shingles ON (pagelets.pagelet_serial = shingles.pagelet_serial) 
LEFT JOIN links ON (pagelets.pagelet_serial = links.pagelet_serial) 
WHERE info.page_key = 144; 

Vous verrez probablement NULL soit dans les colonnes shingles et links, et aucun chevauchement entre ces derniers. C'est-à-dire, il n'y a pas de ligne dans pagelets qui joint à la fois links et shingles. Donc, si vous passez à un INNER JOIN:

SELECT * FROM info 
INNER JOIN pagelets ON (info.page_key = pagelets.page_key) 
INNER JOIN shingles ON (pagelets.pagelet_serial = shingles.pagelet_serial) 
INNER JOIN links ON (pagelets.pagelet_serial = links.pagelet_serial) 
WHERE info.page_key = 144; 

Vous obtiendrez un ensemble vide.

Lorsque vous faites un DELETE bien sûr, il supprime zéro lignes parce que les jointures résultent en un ensemble vide. En ce qui concerne votre question sur la raison pour laquelle cela supprime de deux tables, mais pas les autres, je dois remettre cela en question. Je pense que vous avez fait une erreur, parce que je ne peux pas voir comment il pourrait faire cela.

1

Ceci effacera de l'information et tous les autres ajoutés aux informations. La syntaxe est trompeuse, je sais, mais ça marchera!

DELETE 
    info 
FROM 
    info INNER JOIN pagelets INNER JOIN shingles INNER JOIN links 
WHERE 
    info.page_key=%(page_key)s 
    AND info.page_key=pagelets.page_key 
    AND pagelets.pagelet_serial=shingles.pagelet_serial 
    AND pagelets.pagelet_serial=links.pagelet_serial 

D'ailleurs, je sais que c'est une ancienne poste, mais il y a beaucoup d'utilisateurs qui trouvent ce poste lors de la recherche d'une réponse, donc il n'y a vraiment pas une telle chose que l'ancienne! -Rance

Questions connexes