Можете да използвате съхранена процедура, както споменахте във вашия въпрос, тъй като вмъкването може да бъде дълбоко до 7 нива.
Запазена процедура
СЪЗДАВАНЕ НА ПРОЦЕДУРА updatePath()BEGINdeclare cnt, n int; изберете count(*) в n от foo, където parent_id е нула; update foo a, foo b set a.path =b.name, където b.parent_id е нула и a.parent_id =b.id; изберете count(*) в cnt от foo, където пътят е нулев; докато cnt> n актуализира foo a, foo b зададе a.path =concat(b.path, '/', b.name), където b.path не е null и a.parent_id =b.id; изберете count(*) в cnt от foo, където пътят е нулев; край докато;КРАЙ//
За да проверим действителния запис, току-що отпечатахме обикновените записи с нулева стойност в колоната за път
изберете * от foo
Резултати :
<предварителен код>| ID | ИМЕ | PARENT_ID | ПЪТ |------------------------------------------------| 1 | корен1 | (нула) | (нула) || 2 | дете1 | 1 | (нула) || 3 | subchild1 | 2 | (нула) || 4 | дете2 | 1 | (нула) || 5 | дете3 | 1 | (нула) || 6 | subchild2 | 4 | (нула) || 7 | подподчинение1 | 6 | (нула) |Извикване на процедурата :
път за актуализиране на обаждане
Резултат след изпълнение на процедурата :
изберете * от foo
Резултати :
<предварителен код>| ID | ИМЕ | PARENT_ID | ПЪТ |------------------------------------------------ ----------| 1 | корен1 | (нула) | (нула) || 2 | дете1 | 1 | корен1 || 3 | subchild1 | 2 | корен1/дете1 || 4 | дете2 | 1 | корен1 || 5 | дете3 | 1 | корен1 || 6 | subchild2 | 4 | корен1/дете2 || 7 | подподчинение1 | 6 | root1/child2/subchild2 |SQLFIDDLE
Надявам се това да помогне....