什么是外键?

Yuv*_*dam 13 database foreign-keys

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

id   | name    | whatever
-------------------------
1      Alice     ....
2      Bob       ....
45     Eve       ....
988    ....      ....
Run Code Online (Sandbox Code Playgroud)

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


编辑:好的,这很容易,我想我的问题太复杂了.

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

The*_*TXI 23

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

例:

Table Name - Users

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

Table Name - UserRoles

UserRoleID    Desc
1             Admin
2             Moderator
Run Code Online (Sandbox Code Playgroud)

您可以看到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
Run Code Online (Sandbox Code Playgroud)

输出将是:

UserID    UserName    User Role
1         JohnD       Admin
2         CourneyC    Admin
3         Benjamin    Moderator
Run Code Online (Sandbox Code Playgroud)


Pau*_*des 13

假设你有另一个领域,这是本土城市:

id   | name    | city
-------------------------
1      Alice     San Francisco
2      Bob       New York
45     Eve       New York
988    Bill      San Francisco
Run Code Online (Sandbox Code Playgroud)

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

id   | name    | fk_city
-------------------------
1      Alice     1
2      Bob       2
45     Eve       2
988    Bill      1
Run Code Online (Sandbox Code Playgroud)

家乡城市表:

id   | name
-------------------------
1    | San Francisco
2    | New York
Run Code Online (Sandbox Code Playgroud)

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

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