2010-03-09 157 views
4

我無法弄清楚如何創建外鍵約束。我的數據模型是固定的,超出了我的控制範圍,看起來像這樣:SQL Server有條件的外鍵約束

CREATE TABLE Enquiry 
    (Enquiry_Ref INTEGER PRIMARY KEY CLUSTERED, Join_Ref INTEGER, EnquiryDate, EnquiryType...) 

CREATE TABLE Contact 
    (Contact_Ref INTEGER PRIMARY KEY CLUSTERED, Surname, Forenames ....) 

CREATE TABLE UniversalJoin 
    (Join_Ref INTEGER, Contact_Ref INTEGER, Rel_Type INTEGER) 

每個查詢只有一個聯繫人。這兩者之間的聯繫是其中

Enquiry.Join_Ref = UniversalJoin.Join_Ref AND 
Rel_Type = 1 AND 
UniversalJoin.Contact_Ref = Contact.Contact_Ref 

的Rel_Type不同,取決於源表是什麼,所以在調查的情況下,UniversalJoin表,Rel_Type是1,但另一個表,將設置爲N.

我的問題是如何創建一個外鍵約束來強制這種關係的完整性?我想要說什麼,但不能是:

CREATE TABLE Enquiry 
    ... 
    CONSTRAINT FK_Foo 
    FOREIGN KEY (Join_Ref) 
    REFERENCES UniversalJoin (JoinRef WHERE Rel_Type=1) 
+3

這是一個奇怪的datamodel ... – Paddy 2010-03-09 12:47:06

回答

3

不能使用SQL Server條件或過濾的外鍵

在這種情況下,你可以有一個多列之間FK(JoinRef,Rel_Type)和UniversalJoin設置Rel_Type檢查約束來使它1.

但是,我認爲你正在試圖與多個父母一行無法完成。

3

你也許更願意看看CHECK Constraints

CHECK約束通過限制 被接受的值強制域 完整性由一列組成。它們是 類似於 中的FOREIGN KEY約束,它們控制放入列中的值爲 。所不同的是在 他們如何確定哪些值是 有效的:外鍵約束獲得 有效值從另一個 表的列表,並檢查約束確定來自未基於在數據 邏輯 表達 的有效值另一列。

0

您可以使用帶INSERT和Update的表格觸發器將等同物層疊爲FK。

這樣你就可以應用條件,即如果列值= 1,如果列值= 2,則檢查列值是否存在,然後檢查另一個表格。