2009-01-11 110 views
0

我试图确保在没有更多引用使用级联删除时某些数据会自动删除。我将用基于堆栈溢出的假冒数据库来解释。如何确保在多对多关系中删除冗余数据

我有一个Post表。每篇文章都有零至多个标签。

因此,它应该是这样的:

后< - > PostTags < - >标签

如。

发布1有标签'A','B','C'发布2 有标签'C','D'。

现在,我在做什么是,当我删除所有的职位2(例如,DELETE FROM PostTags WHERE PostId = 2)的标签,我想标签“d”,因为没有其他人,如果引用它也被删除。我认为级联删除会处理这个问题,但当然只有在你从Tag->PostTagsPost->PostTags级联下来的情况下才会这样。

我不知道该如何处理。

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

思考

注:?DB是MS SQL2008

回答

2

不幸的是,你赢了在这里你不能使用级联,当你有多对多的关系时,级联不起作用,因为你不会有一个引用子级的单独父级(在这种情况下,你有多个可以引用的PostTag条目标签表)

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

+0

所以一些东西沿着:DELETE标签WHERE TagId不在(选择TagId FROM Post标签)? (也不知道这是否表现很好) – 2009-01-11 02:30:46

0

我觉得你必须在你的Posts表上使用删除触发器,它检查被删除的帖子的标签,如果它们没有被引用(在PostTags表中),删除它们。

之前删除您的文章,保存该记录:

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

然后,您通过这个rec​​ordsoet如果计数删除后,循环(*)是= 1,则删除该标签。

相关问题