Что такое внешний ключ?

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

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

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


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

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

8 ответов


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

пример:

Table Name - Users

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

Table Name - UserRoles

UserRoleID    Desc
1             Admin
2             Moderator

вы можете видеть, что пользователи.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

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

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

надеюсь, что это делает вещи яснее для вас. :-)

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


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

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

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


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 (вторая)


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


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


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

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

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

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


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

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