我有一张表,比方说,以下列:
Name
,Parent Name
,ID
我们还要说有三个条目,其中Parent Name为Null(意味着它们是最顶层的父级) - F_one,G_one和H_one。
如果我想要删除其中一个父母的所有后代(G_one,为什么不呢?),这意味着G_one的所有孩子,这些孩子的所有孩子,以及那些孩子的孩子,等等一直到终端级别,该行的Name
不存在为任何其他条目的Parent Name
。
这是否可以轻松完成,也许只需一个查询?
奖金,有没有办法选择所有的G_one血统,这样我就可以随心所欲地操纵它了?
可以假设: - 没有孩子在父母之间分享
不能假设: - 离散或甚至一致数量的子级别。
答案 0 :(得分:1)
根据@Marc B的建议,FORIEGN KEY
ON DELETE CASCADE
会实现此目的。
如果您还没有,可以立即添加:
如果UNIQUE
上存在Name
约束(我假设PRIMARY
键os ID
),请跳过此步骤。如果没有,请创建它:
ALTER TABLE tableX
ADD CONSTRAINT unique_Name
UNIQUE (Name) ;
如果上一步成功,请添加FOREIGN KEY
:
ALTER TABLE tableX
ADD CONSTRAINT fk_Name_ParentName
FOREIGN KEY (ParentName)
REFERENCES tableX (Name)
ON UPDATE CASCADE
ON DELETE CASCADE ;
如果上一步成功,您现在可以使用一个语句删除行:
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或更高版本。