MySQL – это открытая реляционная система управления базами данных (СУБД), которая широко используется для хранения, управления и обработки структурированных данных. Она является одной из самых популярных и широко распространенных СУБД в мире, особенно в сфере разработки приложений и веб-сервисов.
Изображение: wikipedia.org
Работу правильно выстроенной реляционной БД невозможно представить без использования в таблицах таких структурных элементов, как первичные и внешние ключи. В настоящей статье рассмотрим предназначение этих ключей в MySQL, а также процесс их создания и удаления в таблице. Кроме того, для более детального понимания работы ключей, в конце статьи будет приведен конкретный пример их использования в БД.
dbaas
Первичный ключ в MySQL – это специальный тип ограничения, который используется для идентификации записей в таблице. Он служит для обеспечения уникальности каждой строки и является основой для связи разных таблиц.
У таких ключей есть ряд отличительных свойств:
NULL
).Ниже приведем пример таблицы users
из некой БД, которая содержит рассматриваемый ключ:
user_id |
username |
|
birthdate |
registration_date |
1 |
example_user1 |
user1@example.com |
1990-05-15 |
2023-09-19 10:30:13 |
2 |
example_user2 |
user2@example.com |
1988-11-30 |
2023-09-19 11:45:10 |
3 |
example_user3 |
user3@example.com |
1999-10-15 |
2023-09-20 12:15:13 |
4 |
example_user4 |
user4@example.com |
1998-12-07 |
2023-09-20 14:34:56 |
В этом примере, поле user_id
– это и есть первичный ключ, который уникально идентифицирует каждую запись. Так, для пользователя с никнеймом example_user1
был создан user_id
, равный 1, для пользователя example_user2
был создан user_id
, равный 2, и так далее.
Чтобы создать первичный ключ в MySQL на этапе формирования таблицы, пользователь должен добавить соответствующую строку в команду:
CREATE TABLE table_name (
…
field_name data_type PRIMARY KEY,
…
);
Здесь на создание поля с первичным ключом указывает ключевое слово PRIMARY KEY
.
Команда ALTER TABLE
используется для изменения структуры ранее созданных таблиц и позволяет добавлять, изменять и удалять столбцы, а также устанавливать различные ограничения и индексы. Она также используется и для добавления рассматриваемого ключа. Синтаксис этого процесса представлен ниже:
ALTER TABLE table_name
ADD PRIMARY KEY (field_name);
Чтобы удалить этот ключ в MySQL, пользователь также может воспользоваться рассмотренной выше командой:
ALTER TABLE table_name
DROP PRIMARY KEY;
Внешний ключ в MySQL – это элемент таблицы, который используется для установления связи с другой таблицей.
Если две таблицы связаны с помощью внешнего ключа, то одну из них, содержащую первичный ключ, принято называть родительской, а другую с внешним ключом – дочерней.
Свойства у рассматриваемого ключа отличны от предыдущего. Он может содержать как нулевые, так и повторяющиеся значения. Помимо этого, количество таких ключей в дочерней таблице может быть больше одного.
Чтобы создать внешний ключ в MySQL при формировании таблицы, пользователю необходимо добавить следующую запись в команду:
CREATE TABLE child_table_name (
...
child_field_name data_type,
FOREIGN KEY (child_field_name) REFERENCES parent_table_name(parent_field_name),
...
);
Помимо этого способа, можно добавить внешний ключ в MySQL в созданную ранее таблицу. Для этого необходимо воспользоваться уже знакомой командой:
ALTER TABLE child_table_name
ADD FOREIGN KEY (child_field_name) REFERENCES parent_table_name(parent_field_name);
Чтобы удалить внешний ключ из таблицы, необходимо воспользоваться следующей командой:
ALTER TABLE table_name
DROP FOREIGN KEY field_name;
При создании внешнего ключа, к нему можно добавить параметры, которые будут задавать действия для строк дочерней таблицы при обновлении (ON UPDATE
) или удалении (ON DELETE
) строки из главной таблицы. Добавление параметров происходит после оператора REFERENCES
. Список возможных параметров представлен ниже:
CASCADE
)Если вы удаляете (обновляете) строку из родительской таблицы, то MySQL автоматически удалит (обновит) связанные строки из дочерней таблицы.
SET NULL
)Если вы удаляете (обновляете) строку из родительской таблицы, то MySQL автоматически установит для внешнего ключа в дочерней таблице значение NULL
.
RESTRICT
)Если вы удаляете (обновляете) строку из родительской таблицы, то MySQL автоматически отменит это действие (выдаст ошибку), если есть связанные строки в дочерней таблице.
NO ACTION
) – аналогична RESTRICT
На этом знакомство с первичным и внешним ключом закончено. Теперь перейдем к практической части статьи, где продемонстрируем применение двух этих ключей.
В данной главе, в качестве примера, создадим БД на сервере Timeweb Cloud.
sudo mysql
create database TestDB;
use TestDB;
Для создания первой таблицы, вводим в консоль:
CREATE TABLE Categories (
CategoryID INT PRIMARY KEY,
CategoryName VARCHAR(30) NOT NULL
);
Здесь CategoryID
– уникальный идентификатор категории, а CategoryName
– ее название. В этом примере, первичный ключ CategoryID
понадобится для связи со второй таблицей.
CREATE TABLE Services (
ServiceID INT PRIMARY KEY,
ServiceName VARCHAR(30) NOT NULL,
CategoryID INT,
FOREIGN KEY (CategoryID) REFERENCES Categories(CategoryID)
);
В создаваемой таблице:
ServiceID
– первичный ключ, идентифицирующий сервис;ServiceName
– название сервиса;CategoryID
– внешний ключ, связывающий сервис с конкретной категорией. Этот внешний ключ ссылается на столбец CategoryID
в таблице «Категории».Всего у компании выделено три категории сервисов, поэтому для первой таблицы данные будут следующими:
INSERT INTO Categories (CategoryID, CategoryName)
VALUES
(1, 'Calculations'),
(2, 'Services'),
(3, 'Administration');
Для второй таблицы возьмем несколько сервисов из разных категорий:
INSERT INTO Services (ServiceID, ServiceName, CategoryID)
VALUES
(101, 'Cloud servers', 1),
(102, 'Dedicated servers', 1),
(103, 'Cloud databases', 2),
(104, 'Load Balancer', 2),
(105, 'Microsoft Licenses', 3);
Теперь созданные таблицы имеют следующий вид:
LEFT JOIN
, для вывода общей информации о всех сервисах и их категориях в компании:SELECT Services.ServiceID, Services.ServiceName, Categories.CategoryName FROM Services
LEFT JOIN Categories ON Services.CategoryID = Categories.CategoryID;
Как итог, получим следующую таблицу:
Как видно по картинке выше, мы получили объединение двух таблиц, где для каждого сервиса указана категория, к которой она привязана, вместо цифры.
Подготовили для вас выгодные тарифы на DBaaS