13

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

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

所以我需要一个好的、简单的例子来解释外键到底是什么。因为我就是不明白:)


编辑:好的,这很容易,我想我把问题复杂化了。

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

4

8 回答 8

25

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

例子:

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
于 2009-03-17T18:16:26.387 回答
15

假设您有另一个字段,即家乡:

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

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

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

于 2009-03-17T18:18:03.233 回答
3

外键是一个表中的一列,它应该唯一地标识另一个表中的某些内容。因此,这些值应对应于该其他表中的主键。

例如,如果您有一个学生正在上课的表格,那么每条记录都将包含一个学生 ID 和一个课程 ID。这些是学生表(每个学生 id 有一个记录)和课程表(每个课程 id 有一个记录)的外键。

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

于 2009-03-17T18:18:33.293 回答
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

外键从 person 表(第一个)指向 country 表中的一行(第二个)

于 2009-03-17T18:20:05.007 回答
0

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

于 2009-03-17T18:17:55.307 回答
0

外键是引用数据库中另一个表的字段。例如,假设您有 2 个表,PERSON并且ADDRESS. 在called中有一个字段,在PERSONcalled中ID有一个字段。您可以将其称为外键。这意味着您不能拥有一个与人无关的地址,因为该字段中的值必须存在于 table 中。ADDRESSPERSON_IDPERSON_IDPERSON.IDADDRESS.PERSON_IDPERSON

于 2009-03-17T18:19:32.013 回答
0

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

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

在这个表中,主键是cartid,外键是id,它将链接到您的第一个表。用户 1 有两辆购物车,每辆购物车各有一件商品。

外键是您用来链接两个或多个具有相关信息的表的工具。

于 2009-03-17T18:21:39.027 回答
0

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

我要指出的是,没有要求主键(因此是外键)是单列。当然,它更简单。但我曾在企业系统上工作过,其中主键长为 11 列,我相信还有比这更长的示例。也就是说,您需要知道 11 个不同列的值,然后才能唯一标识该行。

于 2009-03-17T18:36:41.127 回答