使用外键

时间:2012-04-26 16:20:10

标签: sql foreign-keys

我不熟悉外键,但我非常理解这个概念。

我找到了很多关于如何创建/删除它们的文档,但没有找到如何使用它们的文档。我的架构如下。

股票表:

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

然后产品表

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

如何使用select获取

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

PartID2PartID3外键与PartID主键相关联?

5 个答案:

答案 0 :(得分:2)

外键的概念是将一个表中的ID链接到另一个表中唯一ID的lisk。在您的示例中,您有具有唯一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     

答案 1 :(得分: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

更长的答案是,对于您正在尝试的内容,这并不是一个很好的桌面设计。它假定您始终为任何项目提供固定数量的零件(或至少不超过某个固定数量)。更好的设计是:

Part Table:
partID | model | type | vendor

Product Table:
productID | name

Product_Parts Table:
productID | partID

其中Product_parts中的productID是Product的外键,partID是Part表中的外键。

答案 2 :(得分: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

首次加入库存和零件表时,请先加一个JOIN 然后再次将此连接的结果连接到零件表。

SQL解析器将使用parts表作为两个单独的表,因此您可以在单行中使用相同的tabe获得两个结果。

答案 3 :(得分:0)

您可以在同一个sql语句中多次加入表。在这种情况下,您需要两次加入库存表,一次获取产品中每个零件的名称。

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

答案 4 :(得分:0)

使用LEFT OUTER JOIN表示如果Part1IDPart2ID值设置为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