В чем разница между внешним ключом и ссылочным ключом?

Меня очень смущают эти два термина. Они одинаковые или разные?

Некоторые книги и люди говорят, что они одинаковы, а другие говорят, что они разные.

Я пытался, но не нашел исчерпывающего ответа.


person Anderson    schedule 21.12.2011    source источник


Ответы (10)


Я предполагаю, что вы говорите об использовании REFERENCES, где ключевое слово FOREIGN KEY не используется при ограничении встроенного столбца, что называется ограничением внешнего ключа на уровне столбца, например.

author_id INTEGER REFERENCES author(id)

... вместо ограничения внешнего ключа уровня таблицы, которое размещается после объявлений столбцов...

author_id INTEGER,
FOREIGN KEY(author_id) REFERENCES author(id)

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

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


Обратите внимание, что MySQL 'анализирует, но игнорирует «встроенные спецификации REFERENCES» (как определено в стандарте SQL), где ссылки определены как часть спецификации столбца, что означает, что будет работать только ограничение внешнего ключа на уровне таблицы. .

Оба Postgres и Microsoft SQL Server учитывать ограничения внешнего ключа как на уровне столбца, так и на уровне таблицы.

person Niels Abildgaard    schedule 07.09.2012
comment
Хотя первый будет работать без включения внешних ключей, а второй - нет. Второй способ просто больше не используется? - person Nathan Schwermann; 14.10.2014
comment
Это также имеет значение, если вы пытаетесь использовать обратный инжиниринг для создания диаграмм из вашей базы данных в MySQL Workbench. Если вы использовали первый вариант при создании базы данных, инструмент не сможет создавать связи между элементами диаграммы. - person Artur Nowicki; 14.12.2016
comment
Итак, должны ли мы использовать второй вариант, используя FOREIGN KEY? - person Khanh Le; 30.03.2018
comment
@LittleZero Я думаю, вывод в том, что вы можете использовать то, что предпочитаете. - person Niels Abildgaard; 30.03.2018
comment
Это то, что я хотел. Это simply shorthand syntax for the same thing. - person aagjalpankaj; 20.11.2018
comment
MySQL обрабатывает предложения REFERENCES только тогда, когда они являются частью спецификации FOREIGN KEY. Вот цитата из руководства: MySQL parses but ignores “inline REFERENCES specifications” (as defined in the SQL standard) where the references are defined as part of the column specification. MySQL accepts REFERENCES clauses only when specified as part of a separate FOREIGN KEY specification. Таким образом, первая версия не будет применять отношения внешнего ключа, вторая версия будет. - person exSnake; 09.12.2020
comment
@exSnake, у вас есть ссылка, откуда это цитируется? Было бы хорошо включить в мой ответ - person Niels Abildgaard; 09.12.2020
comment
@NielsAbildgaard здесь dev.mysql .com/doc/mysql-reslimits-excerpt/8.0/en/ - person exSnake; 10.12.2020
comment
@exSnake Наконец-то я обновил ответ, отметив разницу между MySQL и другими реализациями :-) спасибо за совет! - person Niels Abildgaard; 22.01.2021
comment
@NielsAbildgaard хорошо! - person exSnake; 23.01.2021

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

person alpha    schedule 05.07.2017
comment
Я только что попробовал это для случая, когда я хотел убедиться, что значения столбцов существуют в другой таблице (ни уникальной, ни PK). К сожалению, ваше предложение не сработало для этого сценария. Должен ли ссылочный столбец быть уникальным? - person Rautermann; 04.12.2020

«Ссылочный ключ» не является обычным техническим термином в реляционном моделировании или в реализации SQL на английском языке (США).

Внешний ключ «ссылается» на ключ в какой-то другой таблице; может отсюда и путаница?

person Mike Sherrill 'Cat Recall'    schedule 21.12.2011

На самом деле вы не называете что-то ссылочным ключом... Это одно и то же... вы можете увидеть слово references, используемое, например, в sqlite: вы можете использовать такой синтаксис для запуска базы данных авторов и книг. Это позволяет показать, что у одного автора может быть много книг. Это сообщает базе данных, что books.author_id (определено несколькими строками выше) ссылается на author.id

CREATE TABLE 'author' (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    firstname varchar(255)
    lastname varchar(255)
);

CREATE TABLE 'books' (
    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
    author_id INTEGER,
    title varchar(255),
    published date,
    FOREIGN KEY(author_id) REFERENCES author(id)
);
person maneesha    schedule 21.12.2011

Единственное и наиболее важное различие между двумя ключевыми словами «FOREIGN KEY» и «REFERENCES» заключается в том, что оба они делают данные дочерними данными родительской таблицы, «FOREIGN KEY» используется для создания ограничения на уровне таблицы, тогда как Ключевое слово REFERENCES можно использовать только для создания ограничения на уровне столбца.Ограничения на уровне столбца можно создать только при создании таблицы.Но ограничения на уровне таблицы можно добавить с помощью команды ALTER TABLE.

person Community    schedule 16.05.2017

Возможно, вы несколько вольно используете термин «ссылочный ключ»?

Говорят, что значение внешнего ключа в одной строке «ссылается» на строку, содержащую соответствующее значение ключа. Обратите внимание, что слово «ссылка» в предыдущем предложении является глаголом, поэтому мы можем сказать, что у нас есть ссылочное значение внешнего ключа и ссылочное значение ключа.

Хотя это значения ключа, а не ограничение ключа таблицы, на которое ссылаются, я полагаю, грубо говоря, мы могли бы сказать «ссылочный ключ» для обозначения строк, которые содержат значения, на которые потенциально могут ссылаться. Затем я вижу, как «ссылочный ключ» может стать «ссылочным ключом», но не противоречит его происхождению.

person onedaywhen    schedule 22.12.2011

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

person Matt Junior    schedule 30.04.2013

Есть 2 способа объявить внешний ключ(и):

  1. если внешний ключ является ОДНИМ атрибутом:
    REFERENCES ()

  2. если внешние ключи представляют собой СПИСОК атрибутов

ВНЕШНИЙ КЛЮЧ () ССЫЛКИ

person Sebastian Nedumala    schedule 14.12.2014

В терминах стандартного SQL оба приводят к ограничению внешнего ключа.

Одна форма представляет собой ограничение таблицы, то есть она может применяться к одному или нескольким столбцам. Это понадобится вам для ссылки на таблицу с многостолбцовым первичным ключом:

CREATE TABLE child (
    id int PRIMARY KEY,
    parent_id int,
    date date,
    FOREIGN KEY (parent_id, date) REFERENCES parent(id, date)
);

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

CREATE TABLE child (
    id int PRIMARY KEY,
    parent_id int REFERENCES parent(id)
);

Приведенный выше синтаксис работает точно так же, как если бы вы объявили ограничение таблицы для одного столбца (предположим, что СУБД поддерживает этот тип ограничения столбца), а именно:

CREATE TABLE child (
    id int PRIMARY KEY,
    parent_id int,
    FOREIGN KEY (parent_id) REFERENCES parent(id)
);

У пользователей MySQL и его механизма хранения InnoDB часто возникает путаница, что последний стиль ограничения столбца не поддерживается. Вы должны определить ограничение на уровне таблицы для внешнего ключа, даже если это ограничение для одного столбца. Это было странным поведением MySQL с самых первых дней ее существования, когда некоторый синтаксис ограничений действителен, но не приводит к ограничениям. См. обсуждение здесь: https://bugs.mysql.com/bug.php?id=17943

person Bill Karwin    schedule 06.05.2021
comment
Второй пример (код) — это ограничение таблицы, применяемое для одного столбца, верно? Или это ограничение столбца? - person Random Person; 07.05.2021
comment
Это ограничение таблицы. Но это различие касается только того, где оно появляется в синтаксисе. Оба они являются ограничениями внешнего ключа, и их функциональность одинакова. Я сделал правку, чтобы уточнить, но изменился порядок примеров, поэтому ваш комментарий теперь относится к третьему примеру. - person Bill Karwin; 07.05.2021

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

person Nazmus Shakib    schedule 02.09.2020