2015-01-10 2 views
0

ORDER_HEAD 및 ORDER_DETAIL이라는 두 개의 테이블이 있는데 그 구조는 다음과 같습니다.복합 키 테이블과 비 기본 키 테이블 간의 관계

ORDER_HEAD :

ORD_ID (PK) 
ORD_TYPE (PK) 
ORD_DATE 
ORD_NET_TOTAL 

ORDER_DETAIL :

ODD_ID 
ODD_LINE_NO 
ODD_PRODUCT_ID 
ODD_QTY 

내가 ORDER_DETAIL 테이블에 ORDER_HEAD & ODD_ID에서 ORD_ID 사이의 관계를 형성합니다.

기본 키 또는 고유 제한 조건은 관계

왜이 오류가 점점 오전에 참여하기 전에 테이블에 대해 정의해야하지만 SQL Server에서 오류 메시지를 보여줍니다? 이 두 열 사이에 조인을 수행하는 방법이 있습니까 아니면 내 DB 디자인에 문제가 있습니까?

+1

는 ** 복합 ** PK는 모든 외래 키 참조가 ** MUST이 **는 PK의 ** 모든 ** 열을 포함, 여러 열로부터했다. –

답변

2

는 어떤 기준도

ORDER_DETAIL 
============ 
ODD_ID (Fk) 
ORD_TYPE(Fk) -- you need to add this column 
ODD_LINE_NO 
ODD_PRODUCT_ID 
ODD_QTY 

이 같은 Foreign key를 작성해야합니다 모든 열의 ORDER_DETAILComposite primary key

Schema에 포함되어야한다. 당신이있는 경우

ALTER TABLE ORDER_DETAIL 
    ADD CONSTRAINT FK_ORDER_DETAIL 
    FOREIGN KEY(ODD_ID, ORD_TYPE) REFERENCES ORDER_HEAD(ODD_ID, ORD_TYPE) 
+0

답변을 주셔서 감사합니다. ORDER_HEAD 테이블에서 사용할 수있는 동일한 데이터를 복제하지 않습니다. 이 두 열은 모두 불필요한 동일한 값을 포함하게됩니다. – codeGEN

+2

@codeGEN - 같은 데이터가 두 테이블에 모두 표시되지만 복합 기본 키로 외래 키를 만드는 유일한 방법입니다. –

1

UPDATE

문제를 다시 생각 후에 나는 다음을, 당신은 3 열 (ODD_ID, ODD_TYPE, ODD_LINE_NO)로 구성된 테이블 ORDER_DETAIL에 대한 복합 PK를 (사용자 @NoDisplayName 진술처럼) 참조 열 ODD_TYPE를 추가하고 작성하여 목표를 달성해야한다고 생각 다음과 같습니다

는 SQL에서
ORDER_DETAIL 
============ 
ODD_ID   (PK) 
ODD_TYPE  (PK) 
ODD_LINE_NO  (PK) 
ODD_PRODUCT_ID 
ODD_QTY 

그것은있을 수 :

ALTER TABLE ORDER_DETAIL ADD CONSTRAINT PK_Order_Detail PRIMARY KEY NONCLUSTERED (ODD_ID, ODD_TYPE, ODD_LINE_NO) 

그런 다음 ORDER_DETAIL 특정 쌍 (ODD_ID, ODD_TYPE)에 대한 테이블에서 레코드의 주문 행이 있습니다.

필자는 이전 PK를 제거하고 위의 키 (시각적 편집기에서도)를 설정 한 후 두 테이블간에 FK를 만들고 적절한 열을 매핑 할 때 문제가 없어야한다고 생각합니다. 당신이 Composite primary key에서 관계를 만들려면

+0

하나의 'ORDER_HEAD'에 둘 이상의 'ORDER_DETAIL'이 (가) 포함될 수 있기 때문에 그럴 수 없습니다. – codeGEN

+0

답변에 지정한대로 기본 키를 추가했습니다. 하지만 관계를 설정하려고하면 다음과 같은 오류 메시지가 표시됩니다. 'ORDER_HEAD'테이블의 열이 기존 기본 키 또는 UNIQUE 제약 조건과 일치하지 않습니다. – codeGEN

+0

오류를 생성하는 관계를 설정하는 정확한 코드를 작성할 수 있습니까? –