mar*_*kiz 16 sql sql-server-2005
我有一个包含分层数据的表.
一个"ParentId"列,用于保存其父级的Id("ID" - 键列).
删除行时,我想删除所有子项(所有级别的嵌套).
怎么做?
谢谢
在SQL Server上:使用递归查询.给定CREATE TABLE tmp(Id int,Parent int),使用
WITH x(Id) AS (
SELECT @Id
UNION ALL
SELECT tmp.Id
FROM tmp
JOIN x ON tmp.Parent = x.Id
)
DELETE tmp
FROM x
JOIN tmp ON tmp.Id = x.Id
Run Code Online (Sandbox Code Playgroud)
添加外键约束.以下示例适用于MySQL(语法参考):
ALTER TABLE yourTable
ADD CONSTRAINT makeUpAConstraintName
FOREIGN KEY (ParentID) REFERENCES yourTable (ID)
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
这将在数据库级别上运行,dbms将确保删除行后,所有引用行也将被删除.
当行数不太大时,erikkallen 的递归方法就有效。
这是使用临时表来收集所有子项的替代方案:
create table #nodes (id int primary key)
insert into #nodes (id) values (@delete_id)
while @@rowcount > 0
insert into #nodes
select distinct child.id
from table child
inner join #nodes parent on child.parentid = parent.id
where child.id not in (select id from #nodes)
delete
from table
where id in (select id from #nodes)
Run Code Online (Sandbox Code Playgroud)
它从带有 @delete_id 的行开始,并从那里下降。where语句是为了防止递归;如果您确定没有,则可以将其省略。