2012-04-27 15 views
3

두 개의 테이블, 하나의 '마스터'테이블과 하나의 '하위'테이블이 있습니다. 각 테이블에는 'ProductNo'라는 필드가 있는데이 필드는 PRIMARY KEY 및 UNIQUE로 정의됩니다. 'child'테이블에서 'ProductNo'필드를 정의하고 'master'테이블의 동일한 필드를 PRIMARY + UNIQUE로 함께 정의 할 수 있습니까?2 테이블의 기본 키

master: 
ID | ProductNo 

child: 
ID | MasterID (FK on master.ID) | ProductNo 

Relation >> 1 (master) : n (child) 


example data: 
master: 
1 | 1234 
2 | 4567 

child: 
100 | 1 | 3333 
101 | 1 | 4444 
102 | 2 | 5555 
103 | 1 | 1234 <----- NOT ALLOWED! PRODUCT NO ALREADY EXISTING IN TABLE `MASTER` 
104 | 2 | 1234 <----- NOT ALLOWED! PRODUCT NO ALREADY EXISTING IN TABLE `MASTER` 

'ProductNo'가 'master'테이블에 이미있는 경우 'child'테이블 삽입/업데이트를 확인해야합니다.

어떻게 정의 할 수 있습니까? 또는 이에 대한 트리거를 만들어야합니까?

TIA 매트

+3

기본 + 고유 한 의미는 무엇입니까 ??? 기본 키는 기본적으로 고유합니다.둘 사이의 차이점은 기본 키가 null 값을 허용하지 않는다는 것입니다. –

+0

'child' 테이블의 행은 다른 ID가 일치하는지 여부에 관계없이'master' 행의 'ProductNo' 행과 같을 수 없습니다. ? 일부 예제 데이터 및 예상 결과 (업데이트 허용 또는 거부)가 도움이됩니다. – onedaywhen

+0

이미 'master'테이블에있는'child' 테이블에 ProductNo를 허용하지 않습니다. – frgtv10

답변

4

아니요, 테이블간에 복합 PK가 존재하지 않습니다.

데이터 일관성을 위해 ID가 동일한 경우 하위의 FK를 마스터에 추가해야합니다. 편집

if exists (select 1 from master where prodcutId=new_productId) 

좋은 생각이 될 것입니다 :

실제로 좋은 생각은 단 하나 개의 테이블이라고해야 할

문제,이 같은 검사와 트리거를 해결하기 위해 ID와 masterID 필드가있는 제품. 당신은 오늘 당신이 가지고있는 방법을 확신합니다. 당신은 많은 중복 된 데이터를 가지고 있고 당신은 2 단계로 계층에 걸려 있습니다.

+0

메인 스레드에서 예제 데이터를 업데이트했습니다. 이것이 여전히 최선의 방법이라고 생각하십시오. 권리? – frgtv10

+0

네, 그렇지만 내 편집 – Diego

+0

을 사용하면 트리거가 완벽하게 작동합니다. 나는 1 개의 테이블을 사용할 수 없다. 왜냐하면'master'는 더 많은 필드를 가지고 있고'children '테이블이있다. – frgtv10

2

당신은 심지어 외래 키 포인트 경우 자녀의 기본 키에, 아이에게 마스터에서 외래 키를 선언 할 수 있습니다 (원래 답). 이것은 1 대 1의 관계 일 것이고 드물지 않습니다. 행이 마스터에 이미 일치하는 행이 없으면 하위에 존재할 수 없지만 일치하는 하위 행이없는 행이 마스터에 존재할 수 있습니다. 따라서 인서트는 마스터 마스터 순서대로 수행해야합니다.

(질문에 비추어 편집) 귀하의 경우 실제로 언급 한 열은 표의 기본 키가 아니어야하지만 별도의 기본/외래 키가 있습니다 문제의 열은 두 테이블에서 고유해야하므로 질문에 대한 일부 샘플 데이터를 편집 한 것이 분명해졌습니다. 이 경우 두 테이블 모두에서 트리거를 사용하여 다른 테이블에 존재 여부를 확인하고 ProductNo가 이미 있으면 삽입/업데이트를 방지하는 것이 가장 좋습니다.

+0

1 : n 관계가 있습니다. 그건 내가 'ProductNo'에 fk를 사용할 수 없다는 것을 의미한다. – frgtv10

+0

제품 번호가 고유 한 경우 어떻게 가질 수 있습니까? –

+0

내 예제 데이터를 보시오. 메인 스레드 – frgtv10

0

하위 테이블에 ProductNo라는 열을 추가하고 상위 테이블에 외래 키 참조를 추가 할 수 있습니다.

1

@DavidM이 말했듯이 할 수는 있지만 모델링 문제가있는 것으로 보입니다. 먼저, 자연 기본 키 ProductNo이있는 경우 대리 문자 ID을 정의하는 이유는 무엇입니까? 고려해야 할 또 다른 사항은이 두 테이블을 하나의 테이블로 결합하는 것입니다 (1 대 1 사례의 대부분을 이해할 수있는 것처럼).

+0

이것은 사실 일 수있다. 그러나 'master'테이블에는 약 40 개의 필드가 있고 'child'테이블에는 5 개의 필드 만 있습니다. 그게 왜 우리가 2 개의 테이블을 사용하는지. – frgtv10

+0

@ frgtv10, 모델링 선택은 솔루션에 매우 한정적이며 물론 이유가 있습니다. 제 요점은이 선택으로 인한 이점과 절충을 고려하는 것입니다. 1 : 1이 단일 테이블로 모델링 된 경우 사용자가 제시 한이 문제는 단지 문제가되지 않습니다. –

1

두 테이블이 필요합니까? productID와 parentID를 더한 하나만 유지하십시오. 그런 다음 productID는 기본 키와 자동 증가 일 수 있지만 null이 아닌 모든 키 (동일한 테이블에 대해 f.keyed)를 갖는 모든 항목이 하위 항목이됩니다.

관련 문제