一次删除多个表中的行

时间:2011-10-04 20:47:27

标签: php mysql

我正在尝试将2个查询合并为一个这样的

$result=$db->query ("DELETE FROM menu WHERE name = '$new'") or die($db->error);
$result=$db->query ("DELETE FROM pages WHERE title = 'new'") or die($db->error);

$result=$db->query ("DELETE FROM menu AS m, pages AS p WHERE m.name = 'new' AND p.title='new'") or die($db->error);

但DB会出现语法错误。怎么了?

3 个答案:

答案 0 :(得分:7)

DELETE操作必须一次完成一个表。没有办法像你想要的那样组合它们。根据您要完成的操作,您可能需要使用transaction进行这两项操作。

答案 1 :(得分:3)

你确定可以 delete from multiple tables in one statement with MySQL。您的要求可以使用类似以下查询的内容:

DELETE
    menu, pages
FROM
    menu JOIN pages
WHERE
    menu.name = 'some name' AND
    pages.title = 'some title'

或者:

DELETE FROM
    menu, pages
USING
    menu JOIN pages
WHERE
    menu.name = 'some name' AND
    pages.title = 'some title'

但是这些示例有一个问题:两个值必须才能生效。

我认为应该有更多方法来获得所需的结果,没有这种约束(使用其他类型的JOIN我会想到)但是我无法弄清楚它应该如何工作。< / p>

如果要删除的行以某种方式使用外键相互链接(并且您没有对InnoDB表使用外键约束),那么应该更容易实现您想要的操作。这样的事情应该适用:

DELETE
    menu, pages
FROM
    menu LEFT JOIN pages
    ON menu.pageId = page.id # using imagined columns here
WHERE # this where clause might be redundant then
    menu.name = 'some name' AND
    pages.title = 'some title'

但请注意这些例子。首先在测试环境中进行实验,因为我不确定100%的确切含义是否诚实;我只是想提供一个提示,即一次删除多个表

答案 2 :(得分:2)

如果表与外键相关,您可能需要查看ON DELETE CASCADE。基本上它的作用是如果删除其他表是外键的行,它也会删除相关表中的行。