Создание индексов.
Индексы играют большую роль в БД, т. к. это основной способ ускорения их работы. Записи в таблице располагаются хаотически. Чтобы найти нужную запись, необходимо сканировать всю таблицу, на что уходит много времени. Идея индексов состоит в том, чтобы создать для столбца копию, которая постоянно будет поддерживаться в отсортированном состоянии. Это позволяет быстро осуществлять поиск по такому столбцу.
Все необходимые индексы формируются при создании таблицы. Индексированы будут все столбцы, объявленные как PRIMARY KEY, KEY, UNIQUE или INDEX. Индекс также можно добавить с помощью оператора CREATE INDEX. Перед выполнением оператор преобразуется в оператор ALTER TABLE. Например, создание индекса с именем name на основе поля u_name из таблицы users:
create index name on users (u_name);
Перед ключевым словом index может присутствовать UNIQUE, требующее уникальности ограничения.
Корректность таблиц в БД можно проверить с помощью оператора
SHOW TABLES;
Более подробную информацию о структуре таблицы дает команда
DESCRIBE имя_таблицы;
Переименование БД.
Специального оператора переименования БД нет, но можно переименовать каталог БД в системном каталоге (…\DATA).
Удаление БД.
Удалить всю БД вместе с ее содержимым можно командой:
drop database [IF EXISTS] имя_базы_данных;
Удаление таблиц и индексов.
Удалить таблицу можно с помощью оператора:
drop table [IF EXISTS] имя_таблицы;
Удалить индекс можно с помощью оператора:
drop index имя_индекса on имя_таблицы;
Изменение структуры таблиц.
Изменить структуру существующей таблицы можно с помощью оператора ALTER TABLE. Например, можно создать индекс name для таблицы users следующим образом:
alter table users add index name (u_name);
Оператор ALTER TABLE является исключительно гибким, поэтому он имеет огромное множество дополнительных ключевых слов.
4. Выполнение лабораторной работы
После установки MySQL 8.0.32 проверяем существующие базы данных.
Рисунок 1 – Просмотр существующих баз данных
Далее создаём новую базу данных order и проверяем то, что оператор выполнил задачу
Рисунок 2 – Создание новой базы данных.
Теперь имеется пустая БД, ожидающая создания таблиц. Прежде чем работать с БД, выбираем эту БД с помощью оператора USE order;.
Рисунок 3 – Выбор необходимой БД
Теперь все действия по умолчанию будут применяться именно к этой БД. Далее используя оператор CREATE TABLE создаем таблицы.
Создаём таблицы БД по полученной модели данных в Лабораторной работе №1 (представлена на рисунке 4)
Рисунок 4 – Физическая модель данных (Лабораторная работа №1)
Далее на рисунках 5,6,7,8 представлено поочередное создание таблиц PRODUCTS, CLIENTS, DEALS и DELIVERY.
Рисунок 5 – Создание таблиц PRODUCTS.
Рисунок 6 – Создание таблицы CLIENTS.
Рисунок 7 – Создание таблицы DEALS.
Рисунок 8 – Создание таблицы DELIVERY.
При создании таблиц учитываем все имена столбцов, их типы и индексы, описанные ранее в Лабораторной работе №1.
Также обеспечиваем ссылочную целостность с помощью конструкции FOREIGN KEY [name_key] (col1, ... ) REFERENCES tbl (tbl_col, ... ), которая позволяет задать внешний ключ и указать соответствующую таблицу на которую ссылается внешний ключ. Необязательные конструкции ON DELETE и ON UPDATE позволяют задать поведение СУБД при удалении и обновлении строк из таблицы-предка.
Получаем, что в таблице delivery устанавливается связь с таблицей deals (за счёт FOREIGN KEY (delivery_deal__ID) REFERENCES deals(deal_ID)). В таблице deals устанавливается связь с таблицами products (за счет FOREIGN KEY (deal_product_ID) REFERENCES products (product_ID)) и clients (за счет FOREIGN KEY (deal_client_ID) REFERENCES books(client_ID)).
Далее проверим созданную БД и существование таблиц.
Рисунок 9 – Проверка БД order и существования созданных таблиц.
Видим, что таблицы были созданы в соответствующей базе данных book. Ниже представлен листинг процесса выполнения лабораторной работы №2.
Листинг 1. Процесс выполнения задания.
Microsoft Windows [Version 10.0.19045.2546]
(c) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
C:\Users\Morze>mysql --version
mysql Ver 8.0.32 for Win64 on x86_64 (MySQL Community Server - GPL)
C:\Users\Morze>mysql -u root -p
Enter password: ***********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.32 MySQL Community Server - GPL
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
6 rows in set (0.13 sec)
mysql> CREATE DATABASE `order`;
Query OK, 1 row affected (0.06 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| order |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
mysql> USE order;
Database changed
mysql> CREATE TABLE products (
-> product_ID int(6) NOT NULL AUTO_INCREMENT,
-> p_name varchar(100) NOT NULL,
-> p_opt decimal(7,2) NULL default '0.00',
-> p_info varchar(100) NOT NULL,
-> p_status tinyint(1) NOT NULL,
-> PRIMARY KEY (product_ID)
-> );
Query OK, 0 rows affected, 2 warnings (0.13 sec)
mysql> CREATE TABLE clients (
-> client_ID int(6) NOT NULL AUTO_INCREMENT,
-> с_name_company varchar(100) NOT NULL,
-> c_phone varchar(12) NULL,
-> c_address varchar(100) NULL,
-> c_name varchar(20) NOT NULL,
-> c_middlename varchar(20) NOT NULL,
-> c_surname varchar(20) NOT NULL,
-> PRIMARY KEY (client_ID));
Query OK, 0 rows affected, 1 warning (0.12 sec)
mysql> CREATE TABLE deals (
-> deal_ID int(6) NOT NULL AUTO_INCREMENT,
-> deal_product_ID int(6) NOT NULL default '0',
-> deal_client_ID int(6) NOT NULL default '0',
-> deal_number int(6) NULL default '0',
-> deal_time datetime NOT NULL,
-> PRIMARY KEY (deal_ID),
-> FOREIGN KEY (deal_product_ID) REFERENCES products(product_ID) ON DELETE CASCADE ON UPDATE CASCADE,
-> FOREIGN KEY (deal_client_ID) REFERENCES clients(client_ID) ON DELETE CASCADE ON UPDATE CASCADE);
Query OK, 0 rows affected, 4 warnings (0.24 sec)
mysql> CREATE TABLE delivery (
-> delivery_ID int(6) NOT NULL AUTO_INCREMENT,
-> delivery_deal__ID int(6) NOT NULL default '0',
-> delivery_method varchar(100) NOT NULL,
-> delivery_type varchar(100) NOT NULL,
-> delivery_cost decimal(7,2) NOT NULL default '0.00',
-> PRIMARY KEY (delivery_ID),
-> FOREIGN KEY (delivery_deal__ID) REFERENCES deals(deal_ID) ON DELETE CASCADE ON UPDATE CASCADE);
Query OK, 0 rows affected, 2 warnings (0.59 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| order |
| performance_schema |
| sakila |
| sys |
| world |
+--------------------+
7 rows in set (0.00 sec)
mysql> USE order;
Database changed
mysql> SHOW TABLES;
+-----------------+
| Tables_in_order |
+-----------------+
| clients |
| deals |
| delivery |
| products |
+-----------------+
4 rows in set (0.09 sec)
