0

我有下表设置。

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

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

4

3 回答 3

1

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

于 2010-03-18T17:14:25.810 回答
1

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

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

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

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

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

于 2010-03-18T15:33:46.807 回答
1

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

一个 DELETE CASCADE 约束只对细节表起作用,所以很明显,如果一个 Bag 被删除,一个 BagComment 就不能被删除。

这让我想知道如何将一个包注释应用于多个包。

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

于 2010-03-18T15:36:33.483 回答