Что такое внешний ключ и первичный ключ в базах данных
Что проверяют
Понимаете ли вы, что ключи это про целостность, а не только про поиск.
Как отвечать
Первичный ключ уникально определяет строку в таблице. Свойства: значения уникальны, пустых нет, ключ один на таблицу, и под него автоматически создаётся уникальный индекс. Может состоять из нескольких колонок, тогда он составной.
Внешний ключ это колонка, ссылающаяся на первичный ключ другой таблицы. Его задача ссылочная целостность: база не даст вставить строку со ссылкой на несуществующую запись и не даст удалить запись, на которую ссылаются, если не задано иное поведение.
Поведение при удалении родительской строки задаётся явно: запретить, удалить связанные каскадно, обнулить ссылку. Каскадное удаление удобно и опасно одновременно: одна команда может удалить куда больше, чем предполагалось.
Что стоит добавить:
- уникальный ключ отличается от первичного тем, что их может быть несколько и обычно допускается пустое значение. Например электронная почта при первичном ключе-идентификаторе;
- суррогатный ключ против естественного: искусственный идентификатор против значения из предметной области вроде номера документа. Суррогатный предпочитают потому, что естественные значения имеют свойство меняться, а менять первичный ключ больно: за ним потянутся все ссылки;
- внешний ключ не индексируется автоматически. Индекс есть только на стороне, куда ссылаются. Отсутствие индекса на самой ссылающейся колонке замедляет и соединения, и проверку при удалении родителя. Это частая причина неожиданно медленных удалений.
Отдельно про тестирование: ключи это гарантии, которые проверяются напрямую. Попробовать создать дубль, удалить родительскую запись и посмотреть, что стало с дочерними, отправить ссылку на несуществующий идентификатор.
Где спотыкаются
Полагаются на проверку уникальности только в коде приложения.
Не индексируют колонку внешнего ключа.
Ставят каскадное удаление, не продумав последствия.
Выбирают естественный ключ первичным и потом не могут изменить значение.