簡體   English   中英

刪除條目的所有后代(MySQL)

[英]Delete all descendants of an entry (MySQL)

我有一張表,下面是幾列:

NameParent NameID

我們還假設存在三個條目,其中“父級名稱”為Null(意味着它們是最頂層的父級)-F_one,G_one和H_one。

如果要刪除其中一個父母的所有后代(G_one,為什么不刪除?),則意味着G_one的所有子代,這些子代的所有子代以及這些子代的子代,一直到終端級別其中,該行的Name不作為任何其他條目的Parent Name存在。

是否可以輕松完成,也許只需一個查詢?

獎金,有沒有辦法選擇所有G_one血統,以便我可以隨心所欲地操縱它?

可以假定:-沒有父母之間共享孩子

無法假定:-離散級別或什至一致數量的子級別。

正如@Marc B的建議,帶有ON DELETE CASCADEFORIEGN KEY將實現此目的。

如果您還沒有,可以立即添加:

  1. 如果Name上有UNIQUE約束(我假設PRIMARY鍵為os ID ),請跳過此步驟。 如果沒有,則創建它:

     ALTER TABLE tableX ADD CONSTRAINT unique_Name UNIQUE (Name) ; 
  2. 如果上一步成功,請添加FOREIGN KEY

     ALTER TABLE tableX ADD CONSTRAINT fk_Name_ParentName FOREIGN KEY (ParentName) REFERENCES tableX (Name) ON UPDATE CASCADE ON DELETE CASCADE ; 
  3. 如果上一步成功,則現在可以使用一個語句刪除行:

     DELETE FROM tableX WHERE ParentName = 'G_one' ; 

    這將導致: Y rows affected

我無法對此進行測試,但我認為類似的方法可能會起作用:

CREATE TRIGGER casc_del AFTER DELETE on tblName
FOR EACH ROW 
    DELETE FROM tblName 
    WHERE tblName.parent_name is not null 
    AND tblName.parent_name NOT IN (SELECT name FROM tblName)

可以在這里找到有關MySQL中觸發器的更多信息。 注意:此方法僅適用於5.02或更高版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM