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

就我個人而言,我根本不會使用級聯刪除。如果需要一大羣手提包呢?級聯刪除可能會將您的桌子捆綁幾個小時。專門編寫所需的刪除是一種更好的做法。