相关疑难解决方法(0)

使用CTE在自引用表中递归删除行.这个过程是如何进行的?

我正在研究一个辅助项目,为了在自引用表中删除一行及其所有后代,我在触发器中使用这样的递归CTE:

CREATE TRIGGER dbo.tr_Comment_Delete
    ON dbo.Comment INSTEAD OF DELETE
AS
    ;WITH IDs AS (
       SELECT id FROM DELETED
       UNION ALL
       SELECT c.id
       FROM Comment AS c INNER JOIN IDs AS i 
        ON c.parent_comment_id = i.id
    )
    DELETE FROM Comment
    WHERE id IN (SELECT id FROM IDs);
GO
Run Code Online (Sandbox Code Playgroud)

这是自引用表

在此输入图像描述

虽然我有这个代码按预期工作,但这是你做某事的情况之一,但你不太确定它是如何工作的.

更确切地说,我想知道的是,通过使用这种递归CTE(ID),当我尝试删除具有子注释的注释时,我能够避免引用完整性错误吗?

删除评论的过程/顺序是什么?

以此评论层次为例:

3-> 8-> 13 
Run Code Online (Sandbox Code Playgroud)

这里,id 3的注释是根注释.评论8是对评论3的回复,就像评论13是对评论8的回复一样.

删除过程实际上是如何进行的?

PS我尝试添加一个表格,我在计算时插入了ID.不幸的是我无法理解它.这些是这样的表的结果:

id  ins-date
3   2017-09-12 11:48:38.037
8   2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
8   2017-09-12 11:48:38.037
13  2017-09-12 11:48:38.037
Run Code Online (Sandbox Code Playgroud)

sql-server triggers recursive-query sql-cte

6
推荐指数
1
解决办法
519
查看次数

标签 统计

recursive-query ×1

sql-cte ×1

sql-server ×1

triggers ×1