2011-06-12 56 views
5

我有3個表。一個基表,稱之爲表A,兩個表引用表A,稱它們爲表X和表Y.X和Y都有一個引用表A的外鍵約束.X和Y的外鍵也是它們自己的首要的關鍵。約束條件只允許兩個表中的一個引用基表

我想知道是否有可能添加一個約束,只允許這些表中的一個包含引用表A的recrod。所以如果X有一個引用A的記錄,那麼Y不能有一個,如果Y有一個引用A的記錄,那麼X就不能有一個。

這可能嗎?

感謝,

+0

我會好奇你的用例。對你的結構有一些感興趣的事情。您有3個主鍵使用相同的鍵值。 – NullRef 2011-06-12 21:46:30

+0

是的,他們是三個用於存儲用戶帳戶的表。有兩種類型的帳戶。因此,有一個基表,其中包含兩種類型帳戶通用的信息,然後是每個帳戶類型的表格,其中包含特定於該帳戶類型的信息。因此,每張表的PK都是UserID,因爲我認爲這會使事情變得連貫一致,並且通過UserID輕鬆訪問記錄。 – 2011-06-14 13:08:18

回答

7

使用UDF檢查約束(這是Oded的答案)不能很好地擴展並且併發性較差。看到這些:

所以:

  • 創建新表,說TableA2XY
  • 這個具有表A的PK和一個char(1)列使用CHECK來允許ony X或Y.並且對A的PK也有唯一的約束。
  • TableX的和tableY有新的炭(1)柱,用一個檢查,以允許僅分別X或Y
  • TableX的和tableY具有它們FK到TableA2XY上兩列

這是超密鑰或亞型的方法

  • 所有DRI基於
  • 沒有觸發
  • 在CHECK約束表的訪問沒有的UDF。
+0

我和你所描述的完全一樣。最近我切換到在子表中添加持久計算的CHAR(1)列,以便它不會顯示在由SQL提示自動生成的列列表中 – 2011-06-12 21:19:58

1

是的,這是可能的使用CHECK constraints

除了正常的外鍵約束之外,還需要在兩個引用表上添加一個CHECK constraint,以確保在其他引用表中不使用外鍵。

+0

CHECK需要一個不安全且速度慢的標量udf。請看我的答案。 – gbn 2011-06-12 19:11:46

相關問題