确定。所以我知道DB中的主键是什么。如果数据库中有表,则主键是表中每行唯一的单个值。例如:
id | name | whatever
-------------------------
1 Alice ....
2 Bob ....
45 Eve ....
988 .... ....
所以我需要一个好的,简单的例子来解释究竟是什么外键。因为我只是不明白:)
编辑:好的,这很简单,我想我的问题太复杂了。
所以最后一个问题,对外键的唯一限制是它们是我所指的表中的有效主键值吗?
答案 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个表,PERSON
和ADDRESS
。 PERSON
中有一个名为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个不同列的值。