2015-02-17 120 views
1

我有一個表可以在1 *關係與2個不同的表之一。我目前有它設置哪裏有2個可空的列引用另一個表。但是,這會導致級聯刪除的問題。Sql表共享多個一對多關係與刪除級聯

CREATE TABLE [dbo].[TA] (
    [Id]    INT    IDENTITY (1, 1) NOT NULL, 
    CONSTRAINT [PK_TA] PRIMARY KEY CLUSTERED ([Id] ASC), 
); 

CREATE TABLE [dbo].[TB] (
    [Id]    INT    IDENTITY (1, 1) NOT NULL, 
    [TAId]    INT    NOT NULL, 
    CONSTRAINT [FK_TB_To_TA] FOREIGN KEY ([TAId]) REFERENCES [dbo].[TA] ([Id]) ON DELETE CASCADE, 
    CONSTRAINT [PK_TB] PRIMARY KEY CLUSTERED ([Id] ASC), 
); 

CREATE TABLE [dbo].[TC] (
    [Id]    INT    IDENTITY (1, 1) NOT NULL, 
    [TAId]    INT    NULL, 
    [TBId]    INT    NULL, 
    CONSTRAINT [PK_TC] PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_TC_To_TA] FOREIGN KEY ([TAId]) REFERENCES [dbo].[TA] ([Id]) ON DELETE CASCADE, 
    CONSTRAINT [FK_TC_To_TB] FOREIGN KEY ([TBId]) REFERENCES [dbo].[TB] ([Id]), -- NOTE: DELETE CASCADE CAUSES A CIRCULAR REFERENCE 
); 

本質上,這產生一個嵌套結構等:

TA1 
+ -- TC1, TC2 
+ -- TB1 
     + -- TC3, TC4 

甲TC對象應僅是任一TA或TB(不是兩個)的子級。我應該如何去開發這個功能,以便我可以刪除TA行並刪除所有TC和TB引用行?

+0

問題在於,基於TC的結構,它可以是TA,TB的孩子,也可以不是。我無法想出一個辦法來實現這一點。這是一個類似問題的答案http://stackoverflow.com/questions/851625/foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths – Charles380 2015-02-17 22:06:36

+0

這是不幸的...我想我可以刪除除了[TBId]和[TAId] FK列以外,[TBC]和[TAC]創建[TBC]和[TAC]表,其中[TBC]和[TAC]是相同的,但似乎很重複。 – jt000 2015-02-17 22:15:57

回答

0

爲了解決這個問題,我最終將[TC]分成了多個表格described in a blog for entity framework。這創建了以下表結構:

CREATE TABLE [dbo].[TA] (
    [Id]    INT    IDENTITY (1, 1) NOT NULL, 
    CONSTRAINT [PK_TA] PRIMARY KEY CLUSTERED ([Id] ASC), 
); 

CREATE TABLE [dbo].[TB] (
    [Id]    INT    IDENTITY (1, 1) NOT NULL, 
    [TAId]    INT    NOT NULL, 
    CONSTRAINT [FK_TB_To_TA] FOREIGN KEY ([TAId]) REFERENCES [dbo].[TA] ([Id]) ON DELETE CASCADE, 
    CONSTRAINT [PK_TB] PRIMARY KEY CLUSTERED ([Id] ASC), 
); 

CREATE TABLE [dbo].[TCA] (
    [Id]    INT    IDENTITY (2, 2) NOT NULL, 
    [TAId]    INT    NULL, 
    CONSTRAINT [PK_TCA] PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_TCA_To_TA] FOREIGN KEY ([TAId]) REFERENCES [dbo].[TA] ([Id]) ON DELETE CASCADE, 
); 


CREATE TABLE [dbo].[TCB] (
    [Id]    INT    IDENTITY (1, 2) NOT NULL, 
    [TBId]    INT    NULL, 
    CONSTRAINT [PK_TCB] PRIMARY KEY CLUSTERED ([Id] ASC), 
    CONSTRAINT [FK_TCB_To_TB] FOREIGN KEY ([TBId]) REFERENCES [dbo].[TB] ([Id]) ON DELETE CASCADE, 
); 

我設置的身份甚至\奇數值,以防止碰撞產生兩個表的聯合時(見上面的鏈接)。