2010-03-09 4 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) 

각 문의에는 정확히 하나의 연락처가 있습니다. 둘 사이의 링크 Rel_Type은 1,

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

Rel_Type가 귀하의 경우에, 그래서, 소스 테이블이 무엇인지에 따라 달라지는 UniversalJoin 테이블이지만 다른 테이블 것이 N.

설정된 것

내 질문은이 관계의 무결성을 적용하기 위해 외래 키 제약 조건을 어떻게 만듭니 까? 내가하고 싶은 말은하지만, 할 수없는 것은,이다 :

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

이상한 데이터 모델입니다 ... – Paddy

답변

3
당신은 이러한 경우

, 당신은 여러 열 사이의 FK (JoinRef, Rel_Type)을 가질 수 SQL Server의 조건 또는 필터링 외래 키를 사용에 UniversalJoin에 Rel_Type에 대한 점검 제한 조건을 설정할 수 없습니다

그것을 만드십시오.

그러나, 나는 당신이 행할 수없는 여러 부모와 함께 행을 갖고 있다고 생각합니다.

3
당신은 오히려

CHECK 제약 허용되는 값을 제한하여 도메인을 무결성을 CHECK Constraints 좀보고 할 수 있습니다

란으로 값을 제어하는 ​​ 의 FOREIGN KEY 제약 조건과 비슷한 입니다. 차이점들은 올바른 값 이다 결정 방법 이다 : FOREIGN KEY 제약 을 구하는 다른 테이블에서 유효한 값리스트, 및 제약 데이터 을에 기반으로하지 않는 논리 식에서 유효한 값을 결정 점검 다른 열.

0

INSERT 및 Update가있는 테이블 트리거를 사용하여 해당하는 FK를 계층화 할 수 있습니다.

이런 식으로 조건을 적용 할 수 있습니다. 즉, 열 값 = 1 인 경우 열 값 = 2 인 경우 표 a에 검사가 존재하고 다른 표를 확인하십시오.

관련 문제