Введение
В реляционных базах данных данные хранятся в отдельных таблицах.
Чтобы таблицы могли работать как единая система, между ними создаются связи.
Связи позволяют:
- избегать дублирования данных;
- обеспечивать целостность информации;
- связывать записи из разных таблиц;
- формировать сложные аналитические запросы.
В SQL связи реализуются с помощью первичных и внешних ключей.
Первичный ключ (PRIMARY KEY)
Понятие первичного ключа
Первичный ключ (Primary Key) — это поле (или набор полей), которое: - однозначно идентифицирует каждую запись в таблице; - не может содержать NULL; - должно быть уникальным.
Пример:
CREATE TABLE Students (
id INT PRIMARY KEY,
full_name VARCHAR(100)
);
Поле id — уникальный идентификатор студента.
Внешний ключ (FOREIGN KEY)
1. Понятие внешнего ключа
Внешний ключ (Foreign Key) — это поле, которое: - ссылается на первичный ключ другой таблицы; - устанавливает связь между таблицами; - обеспечивает целостность данных.
2. Пример связи «один ко многим»
Таблица групп:
CREATE TABLE Groups (
id INT PRIMARY KEY,
group_name VARCHAR(50)
);
Таблица студентов:
CREATE TABLE Students (
id INT PRIMARY KEY,
full_name VARCHAR(100),
group_id INT,
FOREIGN KEY (group_id) REFERENCES Groups(id)
);
Здесь:
- Groups.id — первичный ключ;
- Students.group_id — внешний ключ;
- один студент принадлежит одной группе;
- одна группа может содержать много студентов.
Типы связей
1. Один к одному (1:1)
Каждой записи первой таблицы соответствует одна запись второй таблицы. Пример: Пользователь — Паспорт. Реализуется через внешний ключ с ограничением UNIQUE.
2. Один ко многим (1:N)
Самый распространённый тип связи. Пример: - Клиент — Заказы - Группа — Студенты - Категория — Товары
Внешний ключ размещается в таблице «многие».
3. Многие ко многим (M:N)
Одна запись первой таблицы может быть связана со многими записями второй таблицы и наоборот. Пример: - Студенты — Дисциплины - Товары — Заказы
Реализуется через промежуточную таблицу.
Пример:
CREATE TABLE Student_Course (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Students(id),
FOREIGN KEY (course_id) REFERENCES Courses(id)
);
Ограничения внешнего ключа
SQL позволяет управлять поведением при изменении или удалении данных.
1. ON DELETE
RESTRICT— запретить удаление (по умолчанию);CASCADE— удалить связанные записи;SET NULL— установить NULL;SET DEFAULT— установить значение по умолчанию.
Пример:
FOREIGN KEY (group_id)
REFERENCES Groups(id)
ON DELETE CASCADE
2. ON UPDATE
Определяет поведение при изменении значения первичного ключа.
ON UPDATE CASCADE
Создание связи в SQL
Связь между таблицами создаётся с помощью ограничения FOREIGN KEY.
Связь можно задать:
1. Во время создания таблицы (CREATE TABLE);
2. После создания таблицы (ALTER TABLE).
Создание связи при CREATE TABLE
Общий синтаксис:
CREATE TABLE имя_таблицы (
поле1 тип,
поле2 тип,
...,
FOREIGN KEY (поле_внешнего_ключа)
REFERENCES имя_родительской_таблицы(поле_первичного_ключа)
ON DELETE действие
ON UPDATE действие
);
Пример
CREATE TABLE Students (
id INT PRIMARY KEY,
full_name VARCHAR(100),
group_id INT,
CONSTRAINT fk_students_group
FOREIGN KEY (group_id)
REFERENCES Groups(id)
ON DELETE RESTRICT
ON UPDATE CASCADE
);
Разберём команду:
- CONSTRAINT fk_students_group — имя ограничения (можно задать своё);
- FOREIGN KEY (group_id) — поле в текущей таблице;
- REFERENCES Groups(id) — таблица и поле, на которое идёт ссылка;
- ON DELETE — поведение при удалении записи в родительской таблице;
- ON UPDATE — поведение при изменении ключа.
Создание связи через ALTER TABLE
Если таблица уже существует, связь можно добавить позже.
Синтаксис:
ALTER TABLE имя_таблицы
ADD CONSTRAINT имя_ограничения
FOREIGN KEY (поле)
REFERENCES родительская_таблица(поле)
ON DELETE действие
ON UPDATE действие;
Пример
ALTER TABLE Students
ADD CONSTRAINT fk_students_group
FOREIGN KEY (group_id)
REFERENCES Groups(id)
ON DELETE CASCADE
ON UPDATE CASCADE;
Возможные действия ON DELETE и ON UPDATE
| Действие | Описание |
|---|---|
| RESTRICT | Запретить удаление/изменение, если есть связанные записи |
| CASCADE | Автоматически удалить/изменить связанные записи |
| SET NULL | Установить NULL в дочерней таблице |
| NO ACTION | Аналогично RESTRICT (в MariaDB) |
Пример CASCADE: Если удалить группу, автоматически удалятся все студенты этой группы.
Требования для создания связи
- Тип данных внешнего ключа и первичного ключа должны совпадать.
- Родительское поле должно быть PRIMARY KEY или UNIQUE.
- Таблицы должны использовать движок InnoDB.
Проверить движок таблицы можно так:
SHOW TABLE STATUS;
Проверка работы связи
Если попытаться вставить запись с несуществующим внешним ключом:
INSERT INTO Students (id, full_name, group_id)
VALUES (1, 'Иванов Иван', 999);
MariaDB выдаст ошибку, если группы с id = 999 не существует. Это и есть механизм обеспечения ссылочной целостности.
Проверка связей
Если попытаться: - добавить запись с несуществующим внешним ключом; - удалить запись, на которую есть ссылка;
SQL выдаст ошибку (если не указано иное поведение). Это называется обеспечение ссылочной целостности.
Практическое значение связей
Связи обеспечивают: - корректность данных; - отсутствие «висячих» записей; - целостность системы; - возможность выполнять JOIN-запросы.
Без связей база данных превращается в набор несвязанных таблиц.
Итоги
- Связи создаются через PRIMARY KEY и FOREIGN KEY.
- Основные типы связей: 1:1, 1:N, M:N.
- Для связи M:N используется промежуточная таблица.
- ON DELETE и ON UPDATE управляют поведением при изменениях.
- Связи обеспечивают ссылочную целостность базы данных.