Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何确保在多对多关系中删除冗余数据_Sql Server_Sql Server 2008_Many To Many - Fatal编程技术网

Sql server 如何确保在多对多关系中删除冗余数据

Sql server 如何确保在多对多关系中删除冗余数据,sql-server,sql-server-2008,many-to-many,Sql Server,Sql Server 2008,Many To Many,我试图确保在没有更多引用的情况下使用级联删除自动删除某些数据。我将用一个基于堆栈溢出的假数据库来解释 我有一张桌子。每个帖子都有零到多个标签 所以它应该看起来像: 张贴标签 例如 1号杆有标签“A”、“B”、“C”和2号杆 有标签“C”、“D” 现在,我要做的是,当我删除post2的所有标记时,例如从PostTags中删除PostId=2,我希望标记'D'也被删除,因为没有其他人引用它。我原以为级联删除可以处理这个问题,但当然只有当你从Tag->PostTags或Post->PostTags级联

我试图确保在没有更多引用的情况下使用级联删除自动删除某些数据。我将用一个基于堆栈溢出的假数据库来解释

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

所以它应该看起来像:

张贴标签

例如

1号杆有标签“A”、“B”、“C”和2号杆 有标签“C”、“D”

现在,我要做的是,当我删除post2的所有标记时,例如从PostTags中删除PostId=2,我希望标记'D'也被删除,因为没有其他人引用它。我原以为级联删除可以处理这个问题,但当然只有当你从Tag->PostTags或Post->PostTags级联下来时才可以

我不知道该怎么办

我担心人们会建议使用触发器:系统的额外复杂性

想法


注意:DB是MS Sql2008。

不幸的是,这里不能使用级联。当您有多对多关系时,级联不起作用,因为您不会有一个引用子级的单一父级。在这种情况下,您有多个PostTags条目,可以引用Tags表


触发器可能是实现这一点的一种方法,但我不推荐这样做。相反,我建议在数据层中,删除PostTags表中的条目后,删除不再引用的标记。如果你有一个存储过程,它删除了条目,你可能想考虑这一点,这样做也比较简单。

< P>我想你必须在POST表上使用OnDeleDebug触发器,这将检查要删除的帖子的标记,并在PostTags表中未引用这些标记时将其删除

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

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

然后,在删除它之后,在这个记录集合中循环,如果count*is=1,则删除该标记。

所以可以这样做:删除标记,其中TagId不在,从PostTags中选择TagId?也不确定这是否非常有效,这基本上就是你要做的。我将把它封装在一个存储过程中,这样,如果您的体系结构允许的话,您可以保存到服务器的多次访问。