如何删除同一个表中存储中的分层父子记录

时间:2012-05-21 08:50:44

标签: php mysql hierarchical-data moodle

id name      parentid
 1 category     0
 2 question1    1
 3 type1        2
 4 type2        2
 5 question2    0
 6 type2        5
 7 type2        5

其中:

  • 类别是父
  • question1 question2 是孩子
  • type1 type2 type3 type4 是孙子

我想写一个MySQL语句来删除包含所有子记录的选定父级。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

MySQL不支持递归查询...

如果你有一个预定的深度,你可以通过一些连接来完成它。

否则,您需要在应用程序中的代码中执行此操作,或者编写存储过程/函数来执行此操作。

编辑:快速递归功能删除...

function recursiveDelete($id) {
    $result=mysql_query("SELECT * FROM yourTable WHERE parentid='$id'");
    if (mysql_num_rows($result)>0) {
         while($current=mysql_fetch_array($result)) {
              recursiveDelete($current['id']);
         }
    }
    mysql_query("DELETE FROM yourTable WHERE id='$id'");
}

答案 1 :(得分:0)

您可以创建外键来支持此功能。

在MySQL中,此操作如下所示:

ALTER TABLE your_table_name ADD CONSTRAINT your_table_name_parentid_to_id
FOREIGN KEY (parentid)
REFERENCES your_table_name (id)
ON DELETE CASCADE ON UPDATE CASCADE; 

然后简单地

DELETE FROM your_table_name WHERE id = 2;

将删除question1,type1和type2。

但在这种情况下,请确保每个parentid值都有相等的id值或者parentid为NULL:

   id  name      parentid
   1   category     NULL
   2   question1    1
   3   type1        2
   4   type2        2
   5   question2    1
   6   type2        5
   7   type2        5

答案 2 :(得分:0)