2014-01-22 28 views
1

我試圖實現一個簡單的甲依賴於B在SQL關係將外鍵約束:簡單例子 - 上表aaaIsChildOf」可能會導致循環或多個級聯路徑

IF OBJECT_ID ('dbo.AdependsonB', 'U') IS NOT NULL 
     DROP TABLE dbo.AdependsonB; 
IF OBJECT_ID ('dbo.aaaPerson', 'U') IS NOT NULL 
     DROP TABLE dbo.aaaPerson; 

CREATE TABLE aaaPerson 
(
    [id] INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    [name] VARCHAR(40) 
) 

CREATE TABLE AdependsonB 
(
    [IsChildOf] INT NOT NULL, 
    [Parent] INT NOT NULL, 
    CONSTRAINT [pk_AdependsonB] PRIMARY KEY ([IsChildOf],[Parent]), 
    CONSTRAINT [CHK_identity] CHECK ([IsChildOf] <> [Parent]), 
    CONSTRAINT [FK_AdependsonB_IsChildOf-aaaPerson_id] FOREIGN KEY ([IsChildOf]) REFERENCES aaaPerson(id) ON DELETE CASCADE, 
    CONSTRAINT [FK_AdependsonB_Parent-aaaPerson_id] FOREIGN KEY ([Parent]) REFERENCES aaaPerson(id) ON DELETE CASCADE, 
) 

當運行這些行的代碼,我得到以下錯誤:

'上表aaaAdependsonB' 引入外來KEY constraint'FK_AdependsonB_Parent-aaaPerson_id可能導致循環或多個級聯路徑

當省略「ON DELETE CASCADE」的代碼運行完美無論是外鍵約束,但它不會是正確的語義。

任何人都可以提出建議,爲什麼和在這種情況下怎麼辦? 我已經閱讀了很多關於這個問題,但我不明白爲什麼沒有任何解決方法無法實現這樣一個簡單的關係。

提前感謝

+0

相關:http://stackoverflow.com/questions/21243365/resolve-cycles-and-multiple-cascade-paths –

+0

爲什麼子表需要IsChildOf和Parent?你能解釋這兩個不同嗎?父母真的是「頂級父母」嗎?而且不能把這種關係更簡單地表達出來 - 你應該始終能夠按照層次路徑到達最高層。您可能可以將所有這些信息放在一張表中。 –

回答

0

我建議採取謹慎的進入某種場景,其中一個父親可以得到很多兒子和刪除兒子使父親的缺失,以及使所有的兒子將被刪除(你能看到這裏的循環?)。

那些什麼邏輯可以躺在業務層上,並更好地處理(刪除所有兄弟等刪除的父親)。

並且分析器是正確的,是不可行的,也不合理,你(可能)創建的多個級聯路徑與冗餘[IsChildOf]和[父]列的週期。

難道你不能只使用自引用FK嗎?你想實現什麼?

相關問題