2011-01-12 91 views
0

我有一個用戶(用戶)表,並且需要創建一個新表來跟蹤哪些用戶引用了其他用戶。所以,基本上,我在同一個表中的行之間創建了多對多的關係。不理解Sql Server錯誤

所以我想創建表UserReferrals列UserId和UserReferredId。我將兩個列都作爲複合主鍵。並且這兩列都是鏈接到User.UserID的外鍵。

由於刪除用戶也應刪除關係,我將兩個外鍵都設置爲級聯刪除。當用戶被刪除時,UserReferrals中的任何相關行也應該刪除。

但是,這給我的留言:

'User' table saved successfully 'UserReferrals' table Unable to create relationship 'FK_UserReferrals_User'. Introducing FOREIGN KEY constraint 'FK_UserReferrals_User' on table 'UserReferrals' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

我沒有得到這個錯誤。級聯刪除僅刪除具有外鍵的行,對嗎?那麼它怎麼會導致「循環級聯路徑」?

感謝您的任何提示。

+0

你是否確定你沒有意外地向後設置一個外鍵約束? – 2011-01-12 02:22:36

+0

我剛剛檢查了好的措施。兩列都將User表顯示爲主鍵表,並將UserReferrals顯示爲外鍵表。 – 2011-01-12 02:25:35

回答

0

思考之後,我開始覺得問題沒有那麼多有關循環級聯路徑一樣,因爲它可能涉及到多個級聯路徑。

儘管我的連接表中的兩個UserID將始終不同,但沒有任何東西阻止它們相同。如果他們都指向同一用戶,並且該用戶已被刪除,則會有多個到聯接表的級聯路徑。

1

如果您的表(A)上引用了表(B),而表(B)又與(A)有關係,或者引用同一個表中的PK的FK,則可以引入場景它在哪裏循環。有時候這在邏輯上是不可能的 - 但是在純理論中,它可能在SQL引擎的眼中。

這是不可避免的。通常我們在SP中處理這些(在EF中我們可以映射到刪除方法)。

+0

我可以讓你詳細說明外鍵如何循環?只有FK雙方級聯,對吧?那麼它怎麼可能會導致關係的PK級聯呢? – 2011-01-12 01:56:50

0

如果您允許級聯刪除,那麼刪除UserId出現在其他用戶的UserReferredId字段中的人員也會導致這些用戶被刪除!我懷疑你想要的是如果與之關聯的用戶被刪除,將UserReferredId的值設置爲null。

有幾種方法,從刪除命令的表格觸發器到使用存儲過程進行刪除。忽略觸發器邪惡的說法,一個可以創建類似:

創建用戶觸發clearUserReferredIdOnUserDelete刪除後 作爲 更新用戶設置UserReferredId =空在那裏UserReferredId中(選擇刪除用戶ID)

這是未經測試,但應該接近。

P