小编Kei*_*ein的帖子

包含自引用表的复杂删除级联

图表

上图是我的数据结构图。它代表一个层次结构,可以包含三种不同类型的“元素”:“A”、“B”和“C”。的关系表明删除级联行为我也喜欢用,如果它是可能的。

所有类型都有共同的属性,包括显示层次结构(父级和索引)中的位置和元素类型的列。这些公共列存储在ElementBase表中。

每种类型的元素还具有独特的属性,这些属性根据元素类型存储在相应的表中。

中的每一行ADataBDataCData引用 中的唯一主行ElementBase。“A”和“C”元素也各自引用“B”元素。“B”元素可以有0个或多个“S”。

我的问题是:如何维护引用完整性并支持级联删除之类的功能?

我希望能够从中删除一行ElementBase并在其中包含相应的行ADataBData或者CData也可以删除。例如,如果从 中删除了“B”类型的元素ElementBase,则首先BData应删除相应的行,然后需要在表ElementBaseCData表中删除所有引用它的“C”类型元素,并且所有“A” "-type 元素需要将它们的引用设置为NULLin AData

最重要的是:如果我删除的元素有任何类型的子元素,我希望相同的逻辑在层次结构中递归运行。

由于ElementBase是自引用,我无法使用该ON DELETE CASCADE表中的简单功能。我也不能使用它,AData或者CData因为它们都引用了BData这可能会导致“多个级联路径”,这在 SQL Server 中显然是邪恶的。

我发现的另一种选择是INSTEAD OF触发器。问题是这种行为必须是递归的,我无法弄清楚如何使它们能够递归并最终在最后进行原始删除。

trigger database-design sql-server referential-integrity cascade

4
推荐指数
1
解决办法
870
查看次数