Вопрос с собеседования · Базы данных
Что обеспечивает foreign key?
JuniorJOIN, ключи и ограниченияSQL
Ещё спрашивают так:
- Зачем нужен внешний ключ?
- Что такое ссылочная целостность?
Коротко
Внешний ключ гарантирует ссылочную целостность: нельзя сослаться на несуществующую строку и нельзя удалить строку, на которую ссылаются (если не задано иное).
orders.customer_id REFERENCES customers(id)— заказ без клиента не вставить- При удалении родителя: RESTRICT/NO ACTION (запрет), CASCADE (удалить детей), SET NULL
- Индекс на ссылающейся колонке не создаётся автоматически в PostgreSQL — нужен для JOIN и удаления родителя
А ещё В шардированных и микросервисных системах FK между базами невозможны — целостность обеспечивает приложение
Подробно
Что проверяет база:
- при вставке и обновлении дочерней строки — что родитель с таким ключом существует (или значение NULL);
- при удалении и изменении ключа родителя — что делать с детьми.
Действия при удалении/обновлении родителя:
NO ACTION/RESTRICT— запретить, пока есть ссылки (по умолчанию);CASCADE— удалить или обновить дочерние строки;SET NULL/SET DEFAULT— обнулить ссылку.
Практика:
- внешний ключ — бесплатная защита от «висячих» ссылок, которые иначе неизбежно появятся из-за багов и ручных правок;
- индекс на колонке внешнего ключа — PostgreSQL его не создаёт сам. Без него JOIN медленный, а удаление родителя проверяет детей полным просмотром дочерней таблицы;
- проверка FK стоит при записи — на очень нагруженных таблицах иногда отказываются от FK осознанно;
- CASCADE опасен: одно удаление может каскадно удалить много данных.
Пример
CREATE TABLE orders (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
customer_id bigint NOT NULL REFERENCES customers(id) ON DELETE RESTRICT
);
CREATE INDEX ON orders (customer_id); -- для JOIN и проверки при удалении клиентаЧто хотят услышать
- Ссылочная целостность: что проверяется при вставке и удалении.
- Действия ON DELETE.
- Индекс на колонке внешнего ключа.
Частые ошибки
- Не создавать индекс на ссылающейся колонке.
- Ставить CASCADE не задумываясь.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Ускорение любых запросов к таблице за счёт хранимых связей между строками
- ✓Ссылочную целостность: нельзя сослаться на несуществующую строку
- ✗Уникальность значений столбца и автоматический индекс для ускорения соединений
- ✗Автоматическое шифрование данных в связанных таблицах при каждой записи
Что спросят дальше
- Когда cascade delete опасен?
- Нужно ли индексировать foreign key?
Разбор темы
- JOIN, ключи и ограничения
INNER/OUTER/CROSS JOIN, ловушка ON vs WHERE, первичные/внешние/уникальные ключи и ссылочная целостность.
Связанные вопросы
Партнёр платформы
Разбор собеседования
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.