2015-10-30 49 views
2

我有一個Person表和Stuff表。 Stuff可能屬於一個人,也可能是其他人(不是所有者)可以使用的東西。SQL Server:表使兩個引用到另一個表

這裏的設計:

  • 編號
  • 名稱

東西

  • 編號
  • OWNERID(非必需)
  • 用戶ID(非必需)

現在修改表,使協會:

alter table [stuff] 
add constraint Stuff2PersonOwner 
    foreign key (PersonId) 
    references [person] (id) ON DELETE SET NULL; 

上面的腳本執行罰款。

alter table [stuff] 
add constraint Stuff2PersonUser 
    foreign key (UserId) 
    references [person] (id) ON DELETE SET NULL; 

當我執行上面的腳本我得到一個異常:

引入外來KEY約束上表「Stuff2PersonUser」「東西」 可能導致循環或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY 約束。

這裏有什麼問題?爲什麼我無法創建與ON DELETE SET NULL的第二個關聯?

+0

正如它所說的,指定'ON DELETE NO ACTION'或'ON UPDATE NO ACTION' – Ormoz

+0

我還沒有嘗試過,但是如果我刪除了這個人,那不會導致問題嗎? – Dilshod

+0

沒有,第一個約束將處理它 – Ormoz

回答

1

documentation爲外鍵指定了以下限制:

該系列產品由單一 觸發級聯引用操作刪除或更新必須形成不包含循環 引用的樹。在DELETE或UPDATE導致的所有 級聯參考操作的列表中,沒有一個表可以出現多次。 此外,級聯參照動作的樹不得比任何指定表的一條路徑多 。當遇到沒有指定NO ACTION的表或 是默認值時,樹的任何分支結束 。

突出顯示的句子描述了正在發生的事情。當刪除Person時,Stuff正在通過兩條潛在路徑到達 - 每個列都有一個。因此,SQL Server不允許使用此選項的第二個外鍵關係。

相關問題