在一个查询中从多个表中删除行的正确方法是什么?
我问的原因是因为我用PHP做这件事。如果我一次一个地使用多个查询从每个表中删除,PHP必须多次访问数据库。如果我使用这种方法会对性能产生任何影响吗?
我知道ON DELETE CASCADE
选项,但这不适用于每个存储引擎。此外,在删除父记录时,可能会出现我不想从子表中删除所有记录的情况。
答案 0 :(得分:2)
DELETE
t1, t2
FROM
table1 AS t1 INNER JOIN table2 AS t2
ON
joinCondition
WHERE
whereCondition
与DELETE查询一样:非常小心
答案 1 :(得分:0)
如果您不知道这个问题的答案,那么您不应该尝试为您的应用程序支持大量RDMS。坦率地说。 CASCADE选项与每个重要的关系数据库一样可用。此外,您应该考虑如何存储分层数据,以删除子记录。
例如,如果您在使用嵌套集模型时尝试删除“文件夹”中的所有“文件”,则只需
DELETE from files where id > :lft and id < :rgt
但是,无论如何,您仍然可以通过使用JOIN删除从多个表中删除。但是,很多RDMS都不支持这个,所以如果您担心使用级联,那么即使您使用DBAL,也无法在每个数据库中使用连接删除。
答案
答案 2 :(得分:0)
我曾经也遇到过类似的问题。我的解决方案是编写自己的min-recusive查询。只需一个查询,它就会为您完成剩下的工作。这是怎么回事:
//主要功能
function factory($ db){$ table = array('table1','table2','table3'...); //我的一直到表12为($ i = 0; $ I&LT; '' 的sizeof($表); $ i ++){
删除($ db,$ table [$ i]);
}}
//删除功能..也可以设置工厂功能,但4个不定期的缘故
删除($ db,$ table){
$ sql ='delete from'。$ table; if($ db-&gt; query($ sql)){echo ucfirst($表)“。删除已完成100%';
}
}
多数是...为非预定义的插入数组工作,克里特变量用于保存数据输入页面中的数组大小,并将删除更改为“插入表格”的准备语句并执行。 希望它能以某种方式帮助你