Получить доступ

Что обеспечивает foreign key?

JuniorJOIN, ключи и ограниченияSQL
Ещё спрашивают так:
  • Зачем нужен внешний ключ?
  • Что такое ссылочная целостность?
Коротко

Внешний ключ гарантирует ссылочную целостность: нельзя сослаться на несуществующую строку и нельзя удалить строку, на которую ссылаются (если не задано иное).

  • orders.customer_id REFERENCES customers(id) — заказ без клиента не вставить
  • При удалении родителя: RESTRICT/NO ACTION (запрет), CASCADE (удалить детей), SET NULL
  • Индекс на ссылающейся колонке не создаётся автоматически в PostgreSQL — нужен для JOIN и удаления родителя

А ещё В шардированных и микросервисных системах FK между базами невозможны — целостность обеспечивает приложение

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Что проверяет база:

  • при вставке и обновлении дочерней строки — что родитель с таким ключом существует (или значение 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?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем