什么是外键?

时间:2009-03-17 18:12:27

标签: database foreign-keys

确定。所以我知道DB中的主键是什么。如果数据库中有表,则主键是表中每行唯一的单个值。例如:

id   | name    | whatever
-------------------------
1      Alice     ....
2      Bob       ....
45     Eve       ....
988    ....      ....

所以我需要一个好的,简单的例子来解释究竟是什么外键。因为我只是不明白:)


编辑:好的,这很简单,我想我的问题太复杂了。

所以最后一个问题,对外键的唯一限制是它们是我所指的表中的有效主键值吗?

8 个答案:

答案 0 :(得分:21)

外键是指向另一个表的主键的字段。

示例:

Table Name - Users

UserID    UserName    UserRoleID
1         JohnD       1
2         CourtneyC   1
3         Benjamin    2

Table Name - UserRoles

UserRoleID    Desc
1             Admin
2             Moderator

你可以看到Users.UserRoleID是指向主键UserRoles.UserRoleID的外键

使用外键使得在其他表上建立关系变得简单,允许您以一种很好的方式将多个表的数据链接在一起:

示例:

SELECT
    a.UserID, 
    a.UserName, 
    b.Desc as [UserRole]
FROM 
    Users a INNER JOIN 
        UserRoles b ON a.UserRoleID = b.UserRoleID

输出将是:

UserID    UserName    User Role
1         JohnD       Admin
2         CourneyC    Admin
3         Benjamin    Moderator

答案 1 :(得分:12)

假设您有另一个领域,即本土城市:

id   | name    | city
-------------------------
1      Alice     San Francisco
2      Bob       New York
45     Eve       New York
988    Bill      San Francisco

现在,在许多行中重复相同的城市是没有意义的。这可能会导致拼写错误,空间占用过多,难以在其他问题中提出结果。所以你使用外键:

id   | name    | fk_city
-------------------------
1      Alice     1
2      Bob       2
45     Eve       2
988    Bill      1

家乡城市表:

id   | name
-------------------------
1    | San Francisco
2    | New York

希望它能让你更清楚。 : - )

更新:关于您的最后一个问题:是的。 : - )

答案 2 :(得分:3)

外键是一个表中的一列,应该唯一地标识另一个表中的内容。因此,值应该与其他表中的主键相对应。

例如,如果您有一个学生参加课程表,则每个记录都会包含学生ID和课程ID。这些是学生表中的外键(每个学生ID有一个记录)和一个课程表(每个课程ID都有一个记录)。

参照完整性意味着所有外键实际上都对应于这些目标表中的主键。例如,您的注册表中的所有学生ID和课程ID都与真实的学生ID和课程ID相对应。

答案 3 :(得分:1)

id   | name    | whatever | countryid
-------------------------------------
1      Alice     ....       13
2      Bob       ....       42
45     Eve       ....       1
988    ....      ....       2

id   | countryid
----------------
1      Japan
2      Spain
13     Norway
42     Italy

外键指向人员表(第一个)到国家/地区表中的行(第二个)

答案 4 :(得分:0)

在关系数据库中,通过让子表引用父表的ID来实现一对多关系。 Child表中的父ID称为外键,因为它引用另一个表的主键。

答案 5 :(得分:0)

外键是引用数据库中另一个表的字段。例如,假设您有2个表,PERSONADDRESSPERSON中有一个名为ID的字段和ADDRESS中名为PERSON_ID的字段。您可以将PERSON_ID称为PERSON.ID作为外键。这意味着您不能拥有与某人无关的地址,因为ADDRESS.PERSON_ID字段中的值必须存在于表PERSON中。

答案 6 :(得分:0)

使用您的表示例,假设您有另一个表:

cartid  |  id  | itemid
-----------------------
100        1       abc
101        1       cde

在此表中,主键是cartid,外键是id,它将链接到您的第一个表。用户1有两个推车,每个推车各有一个。

外键是用于链接两个或多个彼此具有相关信息的表的方法。

答案 7 :(得分:0)

外键是存储在表中的另一个表的主键。假设您有一张客户表和一张订单表。 CustomerId可能是customer表上的主键,OrderId可能是订单表上的主键。但是在订单表上你需要知道这个订单的客户,不是吗?因此,您需要将CustomerId存储在订单表中。在这种情况下,订单表上的CustomerId是外键。

我想指出,不要求主键(因此是外键)是单个列。它更简单,更确定。但我已经在主键长度为11列的企业系统上工作过,而且我确信有更长的例子。也就是说,在唯一标识行之前,您需要知道11个不同列的值。