使用ON无法从多个表中删除MySQL

时间:2009-09-06 17:23:50

标签: mysql

我试图使用以下查询从多个表中删除

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 |

不幸的是,这仅适用于表格链接和信息。 (不知道为什么它对小页面和带状疱疹不起作用)

原始查询是:

#        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
#

任何人都可以解释这个谜团吗?

4 个答案:

答案 0 :(得分:1)

这将删除信息以及加​​入info的所有其他tabled。我知道,语法具有误导性,但它会起作用!

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

顺便说一句,我知道这是一篇古老的帖子,但是有很多用户在搜索答案时都会找到这篇文章,所以真的没有古老的东西! -Rance

答案 1 :(得分:0)

将列出要删除的表名替换为:

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

答案 2 :(得分:0)

更清晰的替代方法是在这些依赖表(pagelet,shingles,links)中使用带有ON DELETE CASCADE的外键限制,以便delete语句不需要那么复杂。

答案 3 :(得分:0)

尝试此查询作为实验:

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;

您可能会在shingleslinks列中看到NULL,并且这些列之间没有重叠。也就是说,pagelets中没有一行加入linksshingles。因此,如果您更改为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;

你会得到一个空集。

当你执行DELETE时,它会删除零行,因为连接会导致空集。

关于你为什么从两张桌子而不是其他桌子上删除的问题,我不得不质疑这一点。我认为你犯了一个错误,因为我看不出它是怎么做到的。