删除条目的所有后代(MySQL)

时间:2012-08-11 20:44:14

标签: mysql

我有一张表,比方说,以下列:

NameParent NameID

我们还要说有三个条目,其中Parent Name为Null(意味着它们是最顶层的父级) - F_one,G_one和H_one。

如果我想要删除其中一个父母的所有后代(G_one,为什么不呢?),这意味着G_one的所有孩子,这些孩子的所有孩子,以及那些孩子的孩子,等等一直到终端级别,该行的Name不存在为任何其他条目的Parent Name

这是否可以轻松完成,也许只需一个查询?

奖金,有没有办法选择所有的G_one血统,这样我就可以随心所欲地操纵它了?

可以假设: - 没有孩子在父母之间分享

不能假设: - 离散或甚至一致数量的子级别。

2 个答案:

答案 0 :(得分:1)

根据@Marc B的建议,FORIEGN KEY ON DELETE CASCADE会实现此目的。

如果您还没有,可以立即添加:

  1. 如果UNIQUE上存在Name约束(我假设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

答案 1 :(得分:0)

我无法测试这个,但我认为这样的事情可能有用:

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中触发器的更多信息here。注意:此方法仅适用于5.02或更高版本。