Первичный и внешний ключ — основа любой реляционной базы данных. Первичный ключ (Primary Key, PK) однозначно идентифицирует каждую строку таблицы: не допускает дублей и NULL-значений, один на таблицу. Внешний ключ (Foreign Key, FK) — поле дочерней таблицы, ссылающееся на PK родительской и обеспечивающее ссылочную целостность: добавить запись с несуществующим FK-значением СУБД не позволит. В этом руководстве — определения, синтаксис CREATE TABLE и ALTER TABLE, сравнение ключей по семи критериям, каскадные операции ON DELETE и ON UPDATE, а также особенности работы с ключами в Microsoft Access.
Первичный ключ — поле или набор полей, однозначно идентифицирующих каждую строку таблицы. Три базовых свойства: уникальность значений (дубли невозможны), запрет NULL-значений даже без явного NOT NULL и строго один PK на таблицу. В реальных схемах роль первичного ключа чаще всего играют числовые идентификаторы — customer_id, order_id, product_id. При объявлении PK СУБД автоматически создаёт кластерный индекс таблицы — это ускоряет поиск записей и JOIN-запросы.
Учитесь бесплатно за счёт государства
Экономия до 100 000 ₽ на любой программе
Простейший вариант — объявить PK прямо в теле CREATE TABLE:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
Именованное ограничение удобнее при командной разработке и отладке:
CREATE TABLE users (
id INT NOT NULL,
name VARCHAR(100),
CONSTRAINT pk_users PRIMARY KEY (id)
);
Добавить или удалить первичный ключ постфактум:
ALTER TABLE users ADD PRIMARY KEY (id);
ALTER TABLE users DROP PRIMARY KEY;
В PostgreSQL вместо AUTO_INCREMENT используется SERIAL (автоинкрементные значения для небольших таблиц) или BIGSERIAL для больших: id SERIAL PRIMARY KEY.
Составной первичный ключ охватывает два и более столбца — уникальной считается именно их совместная комбинация, а не каждый столбец отдельно. Синтаксис: PRIMARY KEY (col1, col2). Типичный сценарий — таблицы связей «многие ко многим»: PRIMARY KEY (order_id, product_id) — это один составной ключ, а не два отдельных.
Внешний ключ — атрибут дочерней таблицы, ссылающийся на первичный ключ родительской. Если в таблице orders поле customer_id объявлено как FK на customers.customer_id, СУБД при каждой вставке строки проверяет: такой клиент должен существовать. Это и есть ссылочная целостность — состояние базы данных без «осиротевших» записей. В отличие от PK, внешний ключ допускает NULL-значения (запись без ссылки на родительскую таблицу допустима) и может встречаться несколько раз в одной таблице.
Освоить проектирование реляционных баз данных с нуля позволяет программа «Специалист по аналитике и базам данных в информационных системах» — 72 часа онлайн, бесплатно в рамках нацпроекта «Кадры». Подробнее — в каталоге программ.
Объявление FK при создании таблицы:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
Именованное ограничение через CONSTRAINT — рекомендуется, так как упрощает последующее удаление:
CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
Добавление и удаление FK через ALTER TABLE:
ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
ALTER TABLE orders DROP FOREIGN KEY fk_orders_customer;
В MySQL внешние ключи поддерживает только движок хранения InnoDB — стандарт с версии MySQL 5.5. Таблицы на MyISAM принимают синтаксис FOREIGN KEY без ошибок, но игнорируют ограничение. При добавлении FK MySQL автоматически создаёт индекс внешнего ключа, который задействован при каждой проверке ссылочной целостности.
Сравнительная таблица по семи критериям — удобная точка отсчёта при проектировании реляционной базы данных и выборе нужного инструмента.
| Критерий |
Первичный ключ (PK) |
Внешний ключ (FK) |
|---|---|---|
| Уникальность | Обязательна: дубли невозможны | Не требуется: значения могут повторяться |
| NULL | Запрещён | Допустим |
| Количество на таблицу | Один | Несколько — норма |
| Назначение | Идентифицирует строку внутри таблицы | Задаёт связь с другой таблицей |
| Автоиндекс | Кластерный, создаётся автоматически | Некластерный, создаётся автоматически (MySQL) |
| Каскадирование | Не применяется | ON DELETE / ON UPDATE |
| Движок MySQL | Любой | Только InnoDB |
PK идентифицирует запись внутри своей таблицы, FK задаёт связь между таблицами. Вместе они обеспечивают согласованность данных и превращают разрозненные таблицы в целостную реляционную структуру.
Каскадные операции задают поведение дочерних записей при изменении или удалении строки в родительской таблице. Их указывают при объявлении FK:
FOREIGN KEY (customer_id)
Хотите сменить профессию или повысить квалификацию?
Федеральный проект «Активные меры содействия занятости» даёт возможность пройти обучение бесплатно за счёт государства
REFERENCES customers(customer_id)
ON DELETE CASCADE
ON UPDATE SET NULL
Если ON DELETE или ON UPDATE не указаны, MySQL по умолчанию применяет RESTRICT.
| Опция |
Поведение при изменении/удалении родительской записи |
|---|---|
| CASCADE | Дочерние записи удаляются или обновляются автоматически |
| RESTRICT | Операция блокируется, если есть ссылающиеся дочерние строки (по умолчанию) |
| SET NULL | FK-поле дочерней записи получает значение NULL |
| NO ACTION | Аналог RESTRICT; проверка откладывается до конца транзакции |
| SET DEFAULT | FK-поле получает значение по умолчанию (поддержка зависит от СУБД) |
Полный пример: родительская таблица customers с первичным ключом и дочерняя orders с FK:
CREATE TABLE customers (
customer_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers(customer_id)
ON DELETE RESTRICT
);
Проверить структуру таблицы помогут DESC orders или SHOW CREATE TABLE orders — второй вариант показывает полный синтаксис вместе со всеми ограничениями.

Пять ошибок, с которыми сталкиваются чаще всего:
В Microsoft Access первичные и внешние ключи создаются через графический интерфейс — без SQL-синтаксиса. Инструмент ориентирован на бухгалтеров, студентов и малый бизнес. Чтобы задать первичный ключ: откройте таблицу в режиме конструктора, выделите нужное поле и нажмите «Ключевое поле» на панели. При создании новой таблицы Access автоматически предлагает поле-счётчик (аналог AUTO_INCREMENT) в роли первичного ключа.
Для настройки FK используется «Схема данных»: вкладка «Работа с базами данных» → «Схема данных» → перетащите поле из родительской таблицы на соответствующее поле дочерней. В открывшемся диалоге можно включить обеспечение ссылочной целостности и задать каскадное обновление или удаление — всё без единой строки кода.
Первичный ключ (PK) — уникальный идентификатор строки таблицы: запрещает NULL и дублирование, один на таблицу. Внешний ключ (FK) — поле дочерней таблицы, ссылающееся на PK родительской. FK обеспечивает ссылочную целостность: нельзя добавить FK-значение без соответствующей записи в родительской таблице. Вместе PK и FK — основа реляционной модели данных.
Да. В отличие от первичного ключа, внешний ключ допускает NULL-значения — запись в дочерней таблице может существовать без ссылки на родительскую. Например, заказ без привязки к клиенту, если customer_id в orders не заполнен. Но если FK-поле имеет значение, оно обязано совпадать с существующим PK в родительской таблице.
Ровно один — это фундаментальное ограничение реляционной модели. PK может быть составным и включать несколько столбцов, но таблица имеет только один первичный ключ. Например, PRIMARY KEY (order_id, product_id) — один составной ключ, а не два. Количество внешних ключей в одной таблице при этом не ограничено.
Да, это распространённая практика в таблицах связей «многие ко многим». Оба столбца такой таблицы образуют составной первичный ключ и одновременно являются внешними ключами, ссылающимися на разные родительские таблицы. Это стандартный результат нормализации базы данных при соответствующем типе отношений.
Результат зависит от опции ON DELETE. При RESTRICT (по умолчанию) MySQL заблокирует удаление, если в дочерней таблице есть ссылающиеся строки. При CASCADE дочерние записи удалятся автоматически. При SET NULL FK-поле дочерней записи получит значение NULL. Опцию задают при создании FK: ON DELETE CASCADE.
PK уникально идентифицирует строку в своей таблице: не допускает NULL и дублей, один на таблицу. FK хранит ссылку на PK другой таблицы: значения могут повторяться, NULL допустим, несколько FK в одной таблице — норма. В схеме «клиенты–заказы»: customer_id в customers — PK, тот же customer_id в orders — FK.
PK задаёт уникальность: каждая строка получает неповторимый идентификатор. FK задаёт связь: дочерняя таблица через FK «знает» о родительской. Вместе они превращают набор отдельных таблиц в реляционную структуру, где данные согласованы и не дублируются — это и есть цель проектирования базы данных.
MySQL создаёт индекс для FK-столбца автоматически при добавлении ограничения FOREIGN KEY. Индекс используется при каждом INSERT, UPDATE и DELETE для проверки ссылочной целостности. Удалять его вручную не рекомендуется: это снизит производительность JOIN-запросов и операций каскадирования без какой-либо выгоды.
Подайте заявку —
забронируйте место в группе
45 000 мест на 2026 год. Бесплатное обучение по федеральному проекту «Активные меры содействия занятости»