删除SQL表中的分层数据

mar*_*kiz 16 sql sql-server-2005

我有一个包含分层数据的表.
一个"ParentId"列,用于保存其父级的Id("ID" - 键列).

删除行时,我想删除所有子项(所有级别的嵌套).

怎么做?

谢谢

eri*_*len 9

在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)


sou*_*rge 5

添加外键约束.以下示例适用于MySQL(语法参考):

ALTER TABLE yourTable
ADD CONSTRAINT makeUpAConstraintName
FOREIGN KEY (ParentID) REFERENCES yourTable (ID)
ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)

这将在数​​据库级别上运行,dbms将确保删除行后,所有引用行也将被删除.

  • SQL Server 2005 不支持自引用级联删除。当您尝试删除包含“子”行的行时,您将收到错误消息。 (2认同)

And*_*mar 4

当行数不太大时,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语句是为了防止递归;如果您确定没有,则可以将其省略。