Что именно является внешним ключом? - PullRequest
11 голосов
/ 17 марта 2009

Хорошо. Так что я знаю, что такое первичный ключ в БД. Если у вас есть таблица в базе данных, первичный ключ - это одно значение, уникальное для каждой строки в вашей таблице. Например:

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

Так что мне нужен хороший, простой пример, чтобы объяснить, что именно является внешним ключом. Потому что я просто не понимаю:)


Редактировать: ОК, это довольно легко, я думаю, я слишком усложнил проблему.

Итак, последний вопрос, единственное ограничение для внешних ключей заключается в том, что они являются допустимым значением первичного ключа в таблице, на которую я ссылаюсь?

Ответы [ 8 ]

21 голосов
/ 17 марта 2009

Внешний ключ - это поле, которое указывает на первичный ключ другой таблицы.

Пример:

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
12 голосов
/ 17 марта 2009

Допустим, у вас есть другое поле, в котором находится родной город:

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

Надеюсь, это прояснит для вас. : -)

Обновление : о вашем последнем вопросе: Да. : -)

3 голосов
/ 17 марта 2009

Внешний ключ - это столбец в одной таблице, который должен однозначно идентифицировать что-то в другой таблице. Таким образом, значения должны соответствовать первичным ключам в этой другой таблице.

Например, если у вас есть таблица студентов, посещающих курсы, каждая запись будет содержать идентификатор студента и идентификатор курса. Это внешние ключи в таблице учеников (где для каждого идентификатора студента есть одна запись) и в таблице курсов (где для каждого идентификатора курса есть одна запись).

Ссылочная целостность означает, что все ваши внешние ключи фактически соответствуют первичным ключам в этих таблицах назначения. Например, все идентификаторы учащихся и идентификаторы курсов в вашей регистрационной таблице соответствуют реальным идентификаторам учащихся и идентификаторам курсов.

1 голос
/ 17 марта 2009
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

Внешний ключ указывает из таблицы персонала (первая) на строку в таблице страны (вторая)

0 голосов
/ 17 марта 2009

Внешний ключ - это первичный ключ из другой таблицы, хранящейся в вашей таблице. Скажем, у вас есть таблица клиентов и таблица заказов. CustomerId, вероятно, является первичным ключом в таблице клиентов, а OrderId, вероятно, является первичным ключом в таблице заказов. Но на столе заказа вам нужно знать клиента для этого заказа, нет? Поэтому вам нужно хранить CustomerId в таблице заказов. В этом случае CustomerId в таблице заказов является внешним ключом.

Я хотел бы отметить, что не требуется, чтобы первичный ключ (и, следовательно, внешний ключ) был одним столбцом. Это проще, конечно. Но я работал над корпоративными системами, где первичный ключ был длиной в 11 столбцов, и я уверен, что есть примеры длиннее. То есть вам нужно знать значение для 11 различных столбцов, прежде чем вы сможете однозначно идентифицировать строку.

0 голосов
/ 17 марта 2009

используя пример таблицы, предположим, что у вас есть другая таблица:

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

в этой таблице первичный ключ - это cartid, внешний ключ - это идентификатор, который будет связан с вашей первой таблицей. У пользователя 1 есть две тележки, каждая из которых имеет по одному предмету.

внешний ключ - это то, что вы используете для связи двух или более таблиц, которые имеют связанную информацию друг с другом.

0 голосов
/ 17 марта 2009

Внешний ключ - это поле, которое ссылается на другую таблицу в базе данных. Например, предположим, что у вас было 2 таблицы, PERSON и ADDRESS. Поле в PERSON называется ID, а поле ADDRESS называется PERSON_ID. Вы должны сделать PERSON_ID ссылкой на PERSON.ID как внешний ключ. Это означает, что вы не можете иметь адрес, который не связан с человеком, так как значение в поле ADDRESS.PERSON_ID должно существовать в таблице PERSON.

0 голосов
/ 17 марта 2009

В реляционной базе данных отношение один ко многим реализуется с помощью ссылки на дочернюю таблицу на идентификатор родительской таблицы. Родительский идентификатор в дочерней таблице называется внешним ключом, поскольку он ссылается на первичный ключ другой таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...