在一个查询中删除多个表中的行

时间:2011-08-17 12:50:38

标签: php mysql delete-row sql-delete cascading-deletes

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

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果您不知道这个问题的答案,那么您不应该尝试为您的应用程序支持大量RDMS。坦率地说。 CASCADE选项与每个重要的关系数据库一样可用。此外,您应该考虑如何存储分层数据,以删除子记录。

例如,如果您在使用嵌套集模型时尝试删除“文件夹”中的所有“文件”,则只需

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

但是,无论如何,您仍然可以通过使用JOIN删除从多个表中删除。但是,很多RDMS都不支持这个,所以如果您担心使用级联,那么即使您使用DBAL,也无法在每个数据库中使用连接删除。

答案

  • 使用DBAL,例如Doctrine DBAL(不是ORM),并使用支持的Cascades。
  • 选择一个数据库,然后根据您的知识进行开发。

答案 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%';

     

}

}

多数是...为非预定义的插入数组工作,克里特变量用于保存数据输入页面中的数组大小,并将删除更改为“插入表格”的准备语句并执行。 希望它能以某种方式帮助你