2012-05-21 42 views
1
id name  parentid 
1 category  0 
2 question1 1 
3 type1  2 
4 type2  2 
5 question2 0 
6 type2  5 
7 type2  5 

其中:如何刪除層次式父子紀錄店在同一個表

  • 是父
  • 問題1問題2是孩子的
  • TYPE1type2類型3TYPE4是grandchilds

我想寫一個MySQL聲明與所有子記錄刪除選定的父母。我怎樣才能做到這一點?

+0

納比爾先生,爲什麼不給父母,孩子和大孩子分開桌子,考慮將來會把過去放在棺材裏?做好準備。 – beck03076

+0

hye beck..this是在moodle中創建的默認表..所以我只是按照db結構.. – nabil

回答

2

MySQL不支持遞歸查詢...

如果你有一個預定的深度,你可以與一些做連接。

否則,您需要在應用程序中的代碼中執行此操作,或者編寫一個Stored Proc/Function來執行此操作。

編輯:快速遞歸函數刪除...

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'"); 
} 
+0

所以我怎麼能做到這一點? – nabil

+0

只是想我會提到 - 下面的解決方案(由魯本)也將工作。只取決於你是首選的方法。 – Brian

+0

我認爲在性能上存在顯着差異(許多查詢到數據庫或一個查詢)。但是一些數據庫引擎不支持外鍵。所以Brian的解決方案更通用。 – Ruben

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; 

將刪除問題1,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 
相關問題