我有以下表格设置。
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
此表中的行将删除,但注释表中的行不会删除。
答案 0 :(得分:1)
使用您当前的结构,删除BagComment
时,Bag
记录不会被删除,只会删除BagCommentRelation
记录。删除从Bag
级联到BagCommentRelation
,但会在那里停止。您拥有的结构看起来像Bag
和BagCommentRelation
之间的多对多关系。你为什么需要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)
就个人而言,我根本不会使用级联删除。如果需要大量的包包怎么办?级联删除可能会占用您的表几个小时。具体编写所需的删除操作是一种更好的做法。