我问这个问题是为了检查我关于级联删除的推理是否正确,以及我是否没有忽略任何东西。我理解这种行为,我不是在问为什么在当前的限制下实施它。
当我们尝试创建一个包含像这样的自引用的表时:
CREATE TABLE [BlogComments] (
[Id] int NOT NULL IDENTITY,
[AuthorName] nvarchar(100) NULL,
[Content] nvarchar(max) NULL,
[CreatedTime] datetime2 NOT NULL,
[ReplyToId] int NULL,
CONSTRAINT [PK_BlogComments] PRIMARY KEY ([Id]),
CONSTRAINT [FK_BlogComments_BlogComments_ReplyToId] FOREIGN KEY ([ReplyToId])
REFERENCES [BlogComments] ([Id]) ON DELETE SET NULL -- Not: CASCADE
);
Run Code Online (Sandbox Code Playgroud)
我们得到了臭名昭著的异常
在表 'BlogComments' 上引入 FOREIGN KEY 约束 'FK_BlogComments_BlogComments_ReplyToId' 可能会导致循环或多个级联路径。
我知道该设置ON DELETE SET CASCADE
实际上可能会导致删除的递归级联,因此可能很危险,或者充其量是耗时的。但ON DELETE SET NULL
不同的是:它只会使ReplyToId
直接子记录无效,而不会使它们的子记录无效。
那么我得出的结论是,当外键定义为 SQL Server 时,SQL Server 的限制性太强了ON DELETE SET NULL
吗?或者我是否忽略了在这种特殊情况下进行此限制的一些充分理由? …