我正在研究一个辅助项目,为了在自引用表中删除一行及其所有后代,我在触发器中使用这样的递归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)