0

我有以下表格设置。级联在SQL Sever 2008中删除不起作用

Bag 
    | 
    +-> BagID (Guid) 
    +-> BagNumber (Int) 

BagCommentRelation 
    | 
    +-> BagID (Int) 
    +-> CommentID (Guid) 

BagComment 
    | 
    +-> CommentID (Guid) 
    +-> Text (varchar(200)) 

BagCommentRelation有袋子和BagComment的外键。

所以,我打开了这两个外键的级联删除,但是当我删除一个包时,它不会删除评论行。

是否需要为此触发一个触发器?或者我错过了什么?

(我使用SQL Server 2008)


注:发帖请求的SQL。这是BagCommentRelation表格的定义。 (我有bagID错误的(我认为这是一个GUID,但它是一个int)的类型。)

CREATE TABLE [dbo].[Bag_CommentRelation](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [BagId] [int] NOT NULL, 
    [Sequence] [int] NOT NULL, 
    [CommentId] [int] NOT NULL, 
CONSTRAINT [PK_Bag_CommentRelation] PRIMARY KEY CLUSTERED 
(
    [BagId] ASC, 
    [Sequence] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[Bag_CommentRelation] WITH CHECK ADD CONSTRAINT [FK_Bag_CommentRelation_Bag] FOREIGN KEY([BagId]) 
REFERENCES [dbo].[Bag] ([Id]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] CHECK CONSTRAINT [FK_Bag_CommentRelation_Bag] 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] WITH CHECK ADD CONSTRAINT [FK_Bag_CommentRelation_Comment] FOREIGN KEY([CommentId]) 
REFERENCES [dbo].[Comment] ([CommentId]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[Bag_CommentRelation] CHECK CONSTRAINT [FK_Bag_CommentRelation_Comment] 
GO 

这个表中的行删除,但在意见表中的行不。

回答

1

在您当前的结构中,当您删除Bag时,BagComment记录不会被删除,只有BagCommentRelation记录。删除级联从BagBagCommentRelation,但在那里停止。您拥有的结构看起来像BagBagCommentRelation之间的多对多关系。你为什么需要BagCommentRelation

编辑:这听起来像最容易做的事情是让你的结构是这样的:

Bag 
    | 
    +-> BagID (Guid) 
    +-> BagNumber (Int) 

BagComment 
    | 
    +-> BagID (Guid) 
    +-> Text (varchar(200)) 

但使用BagComment(或Comment)表格来引用多个对象增加一些复杂性。如果这是你需要做的,this question应该提供帮助。

+0

我们的评论表有很多不同类型的评论。有些桌子使用Guids,PK有些整数。另外,一个包可能有很多评论。 听起来像我需要选择guid或ints,并有FK直接从我的袋子表中。 – Vaccano 2010-03-18 15:49:18

1

您的表BagCommentRelation中Bag和BagComments之间的n:m关系,因此它是两个其他表的细节表。

DELETE CASCADE约束仅适用于细节表,因此如果Bag被删除,BagComment不会被删除。

这让我想知道如何将袋子评论应用于多个包包。

如果你真的需要有相同的BagComment用于不同的Bag记录,我建议在Bag_CommentRelation上删除一个DELETE触发器,它删除关系表中不再引用的所有BagComment。

+0

评论只能应用于一个项目(包,用户)。我们可能使用了错误的表格结构。如果我们有一对多(包到评论)的关系,那么我们是否只在包表中有一个CommentID,然后是从包包到评论的FK? (并沟关系表?) – Vaccano 2010-03-18 15:50:58

+0

@Vaccano是的,你不需要BagCommentRelation。只需在BagComment中添加一个BagID就足够了(如果您需要一个Bag以上的评论) – devio 2010-03-18 15:58:36

1

就我个人而言,我根本不会使用级联删除。如果需要一大群手提包呢?级联删除可能会将您的桌子捆绑几个小时。专门编写所需的删除是一种更好的做法。