edd*_*ddy 6 sql-server triggers recursive-query sql-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)
我想你看到的复杂性并不存在。
你的错误是:
在自引用 CTE 中递归删除行
不存在递归这样的东西DELETE。只能SELECT是。
所以处理很简单:
SELECT使用递归 CTE计算要删除的所有行
DELETE一次操作即可完成所有操作
就这样
| 归档时间: |
|
| 查看次数: |
519 次 |
| 最近记录: |