MySql更新行和它';s";“后代”;

MySql更新行和它';s";“后代”;,mysql,sql-update,hierarchical-data,children,Mysql,Sql Update,Hierarchical Data,Children,我无法确定如何更新行的子代/子代。 示例表,命名为test +----+--------+------+ | Id | Parent | Val | +----+--------+------+ | 1 | 0 | | | 2 | 1 | | | 3 | 1 | | | 4 | 1 | | | 5 | 0 | | | 6 | 5 | | | 7 | 6

我无法确定如何更新行的子代/子代。 示例表,命名为test

+----+--------+------+
| Id | Parent | Val  |
+----+--------+------+
|  1 |      0 |      |
|  2 |      1 |      |
|  3 |      1 |      |
|  4 |      1 |      |
|  5 |      0 |      |
|  6 |      5 |      |
|  7 |      6 |      |
|  8 |      6 |      |
|  9 |      0 |      |
+----+--------+------+
我想做的是,当Val设置为某个值时,更新与该行相关的每一行。例如,如果我跑

UPDATE test SET Val=1 WHERE Id=5;
我希望Id为6、7和8的行中的Val也为1

我能想到的最好的办法就是

UPDATE test t1 
    JOIN test t2 ON t1.Id = t2.Parent 
    JOIN test t3 ON t2.Id = t3.Parent 
SET t1.Val=1, t2.Val=1, t3.Val=1 WHERE t1.Id=5;

+----+--------+------+
| Id | Parent | Val  |
+----+--------+------+
|  1 |      0 |      |
|  2 |      1 |      |
|  3 |      1 |      |
|  4 |      1 |      |
|  5 |      0 |   1  |
|  6 |      5 |   1  |
|  7 |      6 |   1  |
|  8 |      6 |   1  |
|  9 |      0 |      |
+----+--------+------+

这给了我我想要的,但我担心这是一个糟糕的做法,它不能解释一个可变的深度。我能在这里做什么?我以为扳机可能是答案,但那似乎不可能。我得到了错误“无法更新存储函数/触发器中的表,因为调用此存储函数/触发器的语句已经使用了它”

用MySQL处理这种情况非常尴尬,因为

我通过将层次结构存储为可传递闭包而不是您正在使用的“parent_id”样式来解决这个问题。看看我对你的回答

然后可以更新继承人权限中给定节点的所有后代:

UPDATE test JOIN testclosure AS c ON test.id = c.descendant
SET test.val = 1
WHERE c.ancestor = 5;