在一个查询中从几个表中删除行的正确方法是什么?在一个查询中从多个表中删除行
我问的原因是因为我正在用PHP做这个。如果我使用多个查询从每个表中删除一个表,PHP必须多次访问数据库。如果我使用这种方法,会对性能产生影响吗?
我知道ON DELETE CASCADE
选项,但这不适用于每个存储引擎。另外,当我删除父记录时,可能会出现不想从子表中删除所有记录的情况。
在一个查询中从几个表中删除行的正确方法是什么?在一个查询中从多个表中删除行
我问的原因是因为我正在用PHP做这个。如果我使用多个查询从每个表中删除一个表,PHP必须多次访问数据库。如果我使用这种方法,会对性能产生影响吗?
我知道ON DELETE CASCADE
选项,但这不适用于每个存储引擎。另外,当我删除父记录时,可能会出现不想从子表中删除所有记录的情况。
DELETE
t1, t2
FROM
table1 AS t1 INNER JOIN table2 AS t2
ON
joinCondition
WHERE
whereCondition
像往常一样用DELETE查询:要非常小心
如果你不知道这个问题的答案,那么你不应该试图支持众多的RDMS适合您的应用。直言不讳。像每个关系数据库一样,CASCADE选项可用。另外,您应该考虑如何存储分层数据以删除子记录。
例如,如果你想删除所有“文件”在“文件夹”使用嵌套集模型的时候,它仅仅是
DELETE from files where id > :lft and id < :rgt
问题,但在任何情况下,您仍然可以使用JOIN删除从多个表中删除。但是,此不支持大量的RDMS,因此如果您担心使用级联,那么即使使用DBAL,也无法在每个数据库上使用连接删除。
答案
我也曾经遇到类似的问题。我的解决方案是写我自己的最小recruive查询。只有一个查询,它为你做了剩下的事情。这是怎么一回事呢:
//主要功能
功能工厂($ DB){$表=阵列( '表1', '表2', '表3' ...); //我一直到表12
for($ i = 0; $ i <''sizeof($ table); $ i ++){
delete($ db,$ table [$ i]);
}}
//删除功能..可能还有塞提特了withn工厂的功能,但4 undestanging缘故
删除($分贝,$表){
$ SQL ='删除'。$ table;如果($ db-> query($ sql)){echo ucfirst($ table)。'删除完成100%';
}
}
这就是所有...使非预定义的插件组,克里特岛varible保存从您的数据录入页面数组的大小,改变删除到“工作插入表'准备声明并执行。 希望它可以帮助你以某种方式
我听说,在一次从多个表中删除不理想。这是因为语法不允许使用'LIMIT'? – recount88
一般更容易犯了一个错误,将删除比你预期的多。测试你的问题,你应该不会受到伤害。 – Mchl
是否有速度,如果我使用了多个查询删除,而不是一个有什么区别? – recount88