SQL Server 2008中的级联删除无法正常工作

时间:2010-03-18 15:09:55

标签: sql sql-server sql-server-2008 foreign-keys cascading-deletes

我有以下表格设置。

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

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

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

BagCommentRelation有Bag和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

此表中的行将删除,但注释表中的行不会删除。

3 个答案:

答案 0 :(得分:1)

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

编辑:听起来最简单的事情就是让你的结构像这样:

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

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

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

答案 1 :(得分:1)

你的表BagCommentRelation在Bag和BagComments之间的n:m关系,因此它是两个表格的详细表格。

DELETE CASCADE约束仅适用于细节表,因此如果删除Bag,则无法删除BagComment。

这让我想知道如何将行李评论应用于多个行李。

如果确实需要将相同的BagComment用于不同的行李记录,我建议在Bag_CommentRelation上使用DELETE触发器删除关系表不再引用的所有BagComments。

答案 2 :(得分:1)

就个人而言,我根本不会使用级联删除。如果需要大量的包包怎么办?级联删除可能会占用您的表几个小时。具体编写所需的删除操作是一种更好的做法。