摆脱MYSQL中的循环父/子

时间:2015-06-09 00:01:26

标签: php mysql parent-child hierarchical-data circular-reference

我有一张这样的表:

 Attribute  |  Type   | Modifier
------------+---------+----------
 id         | integer | not null
 title      | text    | not null
 parent     | integer | 

parent字段是引用同一个表的外键。

如何确保没有插入循环(循环父/子引用)?例如:

 id         | title   | parent
------------+---------+----------
 1          | A       | 3 or 2
 2          | B       | 1
 3          | C       | 2

我正在使用PHP和MySQL。

1 个答案:

答案 0 :(得分:0)

首先,假设表最初没有循环。如果是,那么你需要手动修复任何循环。然后,当您尝试为子项设置父项时,首先获取子项的潜在父项。然后继续获取父母的父母。如果您到达的节点没有父节点,那么一切正常,您可以设置子节点的父节点。如果你到达孩子,那么你知道如果你设置了那个父母就会创建一个循环。

function canSetParent($child, $parent)
{
    $node = $parent;
    while($node != null)
    {
        if($node->id == $child->id) return false;  //Looped back around to the child
        $node = $node->parent;
    }
    return true;  //No loops found
}