2012-04-26 2 views
0

외래 키가 처음이지만 개념이 매우 잘 이해됩니다.외래 키 사용

나는 그것들을 생성/삭제하는 방법에 관한 문서를 많이 찾았지만 그것을 사용하는 방법에 대해서는 발견하지 못했습니다. 내 스키마는 다음과 같습니다.

주식 테이블 :

 
ProdID | Name | PartID1 | PartID2 ... 
1  | PC1 | 1  | 2 
2  | PC1 | 3  | 4 

가 어떻게

| PC1 | DDr2 | DDR3 | 
| PC1 | WD1 | WD2 | 
PartID2

PartID 기본 키에 연결 PartID3 외래 키를 얻을 수 select을 사용합니까

 
PartID | Model | Type | Vendor 
------------------------------ 
1  | DDr2 | RAM | shop1 
2  | DDr3 | RAM | shop1 
3  | WD1 | HDD | shop2 
4  | WD2 | HDD | shop2 

그런 제품 표?

+0

당신은 테이블 정의에 대한 귀하의 SQL을 게시 할 수 있습니다 :

외래 키가 데이터베이스에 참조 무결성을 유지하는 데 사용됩니다, 당신이 사용할 수있는 데이터가 당신이 원하는 얻을 조인? – ControlAltDel

+1

몇 개의 파트 (partId1, partID2, ...)가 있습니까? 여러 부분 열 대신에 다 대다 관계 테이블을 사용하는 것이 더 좋을까요? – jambriz

답변

0
SELECT s1.Name, p1.Model, p2.Model FROM stock st 
    INNER JOIN product p1 
     ON st.PartID1 = p1.PartID1 
      INNER JOIN product p2 
      ON st.PartID2 = p2.PartID1 

것은 하나 먼저 시간에 가입 부품 테이블에 조인이 결과에 가입 다음 다시 주식과 부품 테이블 에 가입하세요.

SQL 구문 분석기는 파트 테이블을 두 개의 별도 테이블로 사용하므로 한 행에 두 개의 동일한 탭이있을 수 있습니다.

0

같은 SQL 문에서 두 번 이상 테이블에 조인 할 수 있습니다. 이 경우 재고 테이블을 두 번 가입해야합니다. 한 번씩 제품의 각 부품 이름을 가져와야합니다. LEFT OUTER JOIN를 사용

SELECT pr.ProdID, s1.Model, s2.Model 
FROM Product pr, Stock s1, Stock s2 
WHERE pr.PartID1 = s1.PartID 
AND pr.PartID2 = s2.PartID 
0

Part1ID 또는 Part2ID 값이 NULL로 설정하는 경우 제품이 여전히 이벤트를 반환된다는 것을 의미합니다.

SELECT   P.Name, 
       S1.Model, 
       S2.Model 
FROM   Product P 
LEFT OUTER JOIN Stock S1 ON P.PartID1 = S1.PartID 
INNER JOIN  Stock S2 ON P.PartID2 = S2.PartID 
+0

예 2 외측과 잘 작동 : SELECT P.Name, P.PartType, S1.Model AS exp1, S2.Model AS Exp2 제품에서 P LEFT OUTER JOIN 부품 AS S1 ON P.PartID1 = S1.PartID LEFT OUTER JOIN 파트 AS S2 ON P.PartID2 = S2.PartID WHERE (P.Name = 'p1') – Lambda

1

짧은 대답은 더 이상 대답이 정말 당신이 뭘하려는 건지에 대한 좋은 테이블 디자인되지 않는 것입니다 당신이

select p.name, a.model as part1, b.model as part2, c.model as part3 
    from product p, stock a, stock b, stock c 
    where p.partid1 = a.partid and p.partid2 = b.partid and p.partid3 = c.partid 

할 수있다. 모든 항목에 대해 고정 된 수의 파트가 항상 있다고 가정합니다 (또는 최소한 고정 된 수보다 많지는 않음). 더 나은 디자인은 다음과 같습니다

Product_parts에서 제품 ID는 제품에 외래 키입니다 partID는 부품 테이블에 외래 키
Part Table: 
partID | model | type | vendor 

Product Table: 
productID | name 

Product_Parts Table: 
productID | partID 

.

+0

이것은 좋은 조언이므로 항상 계획하는 것이 가장 좋습니다. 어떤 이유로 든 더 많은 부품을 추가하면 제안 된 스키마에 따라 SQL 쿼리를 다시 작성할 필요가 없습니다. – weenoid

+0

예, 그렇지만 여기서는 partID2가 PartID1의 대안이며 제품 테이블의 각 부품 라인은 부품 목록의 항목 중 하나입니다. 제품 제품 파트 목록은 다음 위치에서 수행됩니다. product.name = 'pc1' – Lambda

2

외래 키의 개념은 한 테이블의 ID를 다른 테이블의 고유 ID가있는 디스크에 연결하는 것입니다. 귀하의 예에서 고유 한 ID 및 제품을 사용할 수있는 제품이있는 고유 한 부품이 있으므로 제품 테이블에서 여러 행에 여러 부품 ID를 사용할 수 있습니다.

SELECT A.NAME, 
     B.Model, 
     C.Model 
FROM PRODUCTS A 
     INNER JOIN PARTS B ON B.PARTID1 = A.PARTID 
     INNER JOIN PARTS C ON C.PARTID1 = A.PARTID 
WHERE A.PRODID = 1