我正在尝试将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会出现语法错误。怎么了?
答案 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
。基本上它的作用是如果删除其他表是外键的行,它也会删除相关表中的行。