Первичный ключ
Любая СУБД имеет встроенную систему целостности и непротиворечивости данных. Эта система работает на наборе правил, определённых в схеме базы данных. Первичный ключ и внешние ключи как раз являются одними из таких правил.
Чтобы избегать неоднозначности при поиске в таблицах присутствуют первичный ключ или, как его ещё называют, «ключевое поле».
Ключевое поле (первичный ключ) – это поле (или набор полей), значение которого однозначно определяет запись в таблице.
Если представить простейшую таблицу Users, то в ней ключевым полем является user_id. С помощью данного правила СУБД не позволит нам создать новую запись, где поле user_id будет не уникальным.
Внешний ключ
Внешний ключ – это поле (или набор полей) в одной таблице, которое ссылается на первичный ключ в другой таблице.
Таблица с внешним ключом называется дочерней таблицей, а таблица с первичным ключом называется ссылочной или родительской таблицей.
Правило внешнего ключа гарантирует, что при создании записей в дочерней таблице, значение поля, являющегося внешним ключом, есть в родительской таблице.
Если наличие первичного ключа – это обязательное требование для каждой таблицы в реляционной базе данных, то правило внешнего ключа – нет.
Если внешний ключ не определён, то всё также будет работать, но СУБД не будет проверять, что, например, при создании записи в таблице Purchase в полях buyer_id и good_id лежат значения, которые определены в соответствующих таблицах в поле id.