Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL删除超过3个表的连接不';我不能在特定情况下工作_Php_Mysql_Join - Fatal编程技术网

Php MySQL删除超过3个表的连接不';我不能在特定情况下工作

Php MySQL删除超过3个表的连接不';我不能在特定情况下工作,php,mysql,join,Php,Mysql,Join,我在MySQL中有3个表,我正在处理以下DELETE语句: DELETE c, b, e FROM category c, block b, element e WHERE c.category_id = 1 AND c.category_template_id = 1 AND b.block_category_id = c.category_id AND e.element_category_id = c.category_id 此DELETE语句工作正常,将

我在MySQL中有3个表,我正在处理以下DELETE语句:

DELETE c, b, e
FROM category c, block b, element e
WHERE
    c.category_id = 1 AND
    c.category_template_id = 1 AND
    b.block_category_id = c.category_id AND
    e.element_category_id = c.category_id
此DELETE语句工作正常,将删除id=1的表类别中的数据行以及表块和表元素中相应的数据行

但是,如果table块和/或table元素中没有相应的数据,DELETE语句根本不会删除任何内容(即使category中有一个id=1的数据行)

如何更改声明以涵盖此问题?我搜索了mysql文档、google和stackoverflow将近14个小时。请帮帮我


谢谢你的回答

在如下查询中使用
mysql连接

DELETE c, b, e
FROM category c
LEFT JOIN block b ON c.category_id = b.block_category_id LEFT JOIN element e ON e.element_category_id = c.category_id
WHERE c.category_id = 1 AND c.category_template_id = 1;

这将有助于您

使用以下命令更改
元素
的表定义:

ALTER TABLE block
ADD CONSTRAINT fk_block_category
FOREIGN KEY (block_category_id)
REFERENCES category (category_id)
ON DELETE CASCADE

ALTER TABLE element
ADD CONSTRAINT fk_element_category
FOREIGN KEY (element_category_id)
REFERENCES category (category_id)
ON DELETE CASCADE
现在,当您执行以下删除操作时:

DELETE
FROM category
WHERE
    category_id = 1 AND
    category_template_id = 1;
除了删除匹配的
类别
记录外,其他两个表中引用
类别
中已删除记录的所有记录也将被删除


请注意,可能有一种方法可以修复当前的delete-join查询。如果您使用MyISAM,这将是您唯一的选择。但是由于您使用的是InnoDB,
上的DELETE CASCADE
可能是更明智的选择。

您使用的是MyISAM还是InnoDB?我使用的是InnoDB。您使用和,除非所有条件都满足,否则它不会删除,所以请确保每次即使您的类别模板id为1I,您也需要最后两个条件为真,我建议在删除级联时使用
,如果这对此次删除有意义,请使用
JOIN
而不是在
from
中的delete语句中合并所有表。您应该添加一个解释,说明为什么
左JOIN
解决了问题(当
c
e
不存在匹配的
id
时,没有
b
要删除),即
左连接
(内部)连接
的区别。欢迎@myyvee:-)