2011-08-17 78 views
2

在一个查询中从几个表中删除行的正确方法是什么?在一个查询中从多个表中删除行

我问的原因是因为我正在用PHP做这个。如果我使用多个查询从每个表中删除一个表,PHP必须多次访问数据库。如果我使用这种方法,会对性能产生影响吗?

我知道ON DELETE CASCADE选项,但这不适用于每个存储引擎。另外,当我删除父记录时,可能会出现不想从子表中删除所有记录的情况。

回答

2
DELETE 
    t1, t2 
FROM 
    table1 AS t1 INNER JOIN table2 AS t2 
ON 
    joinCondition 
WHERE 
    whereCondition 

像往常一样用DELETE查询:要非常小心

更多细节在这里:http://dev.mysql.com/doc/refman/5.5/en/delete.html

+0

我听说,在一次从多个表中删除不理想。这是因为语法不允许使用'LIMIT'? – recount88

+0

一般更容易犯了一个错误,将删除比你预期的多。测试你的问题,你应该不会受到伤害。 – Mchl

+0

是否有速度,如果我使用了多个查询删除,而不是一个有什么区别? – recount88

0

如果你不知道这个问题的答案,那么你不应该试图支持众多的RDMS适合您的应用。直言不讳。像每个关系数据库一样,CASCADE选项可用。另外,您应该考虑如何存储分层数据以删除子记录。

例如,如果你想删除所有“文件”在“文件夹”使用嵌套集模型的时候,它仅仅是

DELETE from files where id > :lft and id < :rgt

问题,但在任何情况下,您仍然可以使用JOIN删除从多个表中删除。但是,不支持大量的RDMS,因此如果您担心使用级联,那么即使使用DBAL,也无法在每个数据库上使用连接删除。

答案

  • 使用DBAL,如学说DBAL(不是ORM),并使用瀑布那里支持。
  • 选择一个数据库,并使用你所知道的进行开发。
0

我也曾经遇到类似的问题。我的解决方案是写我自己的最小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保存从您的数据录入页面数组的大小,改变删除到“工作插入表'准备声明并执行。 希望它可以帮助你以某种方式