0

我正在尝试确保在没有更多使用级联删除的引用时自动删除某些数据。我将使用基于 Stack Overflow的假数据库进行解释。

我有一张Post桌子。每个帖子都有零到多个标签。

所以它应该看起来像:

发布 <-> PostTags <-> 标签

例如。

帖子 1 有标签“A”、“B”、“C” 帖子 2 有标签“C”、“D”。

现在,我正在做的是,当我删除帖子 2 的所有标签(例如DELETE FROM PostTags WHERE PostId = 2)时,我希望标签 'D' 也被删除,因为如果没有其他人引用它。我认为级联删除会处理这个问题,但当然只有当你从Tag->PostTagsor级联下来时Post->PostTags

我不知道如何处理这个。

恐怕人们会建议使用触发器:((系统的额外复杂性)。

想法?

注意:数据库是 MS Sql2008。

4

2 回答 2

2

不幸的是,您将无法在此处使用级联。当您具有多对多关系时,级联不起作用,因为您不会有一个引用子级的单一父级(在这种情况下,您有多个可以引用标签表的 PostTags 条目)。

触发器将是执行此操作的一种方法,但我不推荐它。相反,我建议在您的数据层中,删除 PostTags 表中的条目后,删除不再引用的标签。如果您有一个删除条目的存储过程,您可能需要考虑在那里执行此操作(这样做也相对简单)。

于 2009-01-11T02:19:38.837 回答
0

我认为您必须在您的 Posts 表上使用 on delete 触发器,该触发器检查被删除的帖子的标签,如果它们没有被引用(在 PostTags 表中),则将其删除。

在删除您的帖子之前,请保存此记录集:

SELECT tagID, count(*) from PostsTags WHERE postId = 2 group by tagID;

然后,在您删除它之后,循环遍历此记录集,如果 count(*) 为 = 1,则删除该标签。

于 2009-01-23T20:22:58.383 回答