0

我有一张桌子,比如说,以下列:

Name, Parent Name, ID

我们还假设父名称为 Null 的三个条目(意味着它们是最顶层的父) - F_one、G_one 和 H_one。

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

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

奖励,有没有办法选择所有 G_one 血统,以便我可以随心所欲地操纵它?

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

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

4

2 回答 2

1

正如@Marc B 的建议, a FORIEGN KEYwithON DELETE CASCADE可以实现这一点。

如果还没有,现在可以添加:

  1. 如果UNIQUEName(我假设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.

于 2012-08-11T21:30:16.673 回答
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 中的触发器可以在这里找到。注意:此方法仅适用于 5.02 或更高版本。

于 2012-08-11T21:15:31.460 回答