# Импорт данных (вариант 22).
>Разбор импорта данных из задания 22 года [variant22.zip](../data/variant22.zip)
>Эта лекция написана с использованием программы **dBeaver**, т.к. я не нашёл как в в **MySQL Workbench** визуально добавить внешний ключ.
## Текст задания
>Для восстановления таблиц в созданную базу данных воспользуйтесь
предоставленным скриптом (ms.sql или my.sql в зависимости от выбранной СУБД). В процессе разработки приложения Вы **должны доработать эту базу данных**, обеспечив хранение всех данных, которые предоставил Вам заказчик. Для этого вам необходимо будет
**добавить необходимые сущности, атрибуты и связи**.
В файле импорта удалите или закомментируйте команду создания БД (напоминаю, что прав на **DDL** у вас нет). В команде **use** укажите название вашей БД.
```sql
-- create database trade;
use ekolesnikov;
```
Дальше желательно проверить скрипт на использование ключевых слов **SQL** в именах сущностей или атрибутов (в этом скрипте используется зарезервированное слово **Order**). Такие слова нужно экранировать (заключить в обрантые кавычки: ``` `Order` ```) либо сразу запустить скрипт и править ошибки по мере выявления (тут придётся комментировать уже выполненные части скрипта)

После разворачивания структуры нужно визуально убедиться, что она соответсвует **3НФ**.
## Проверка структуры

Например, в таблице **Product** первичным ключём сделан *Артикульный номер* с типом **строка**. Нужно добавить синтетический первичный ключ **ProductID** и переделать связь с ним из таблицы **OrderProduct**.
Нам нужно: удалить существующую связь, добавить синтетический первичный ключ, создать новую связь с новым первичным ключём.
1. Удалим связь с продукцией из таблицы связей **OrderProduct** (иначе мы не сможем удалить существующий первичный ключ)

У таблицы **OrderProduct** два внешних ключа и неочевидные названия связей. Открываем связи и смотрим на какую таблицу они ссылаются. Нам нужно удалить ту, которая ссылается на таблицу **Product** (ключ не удаляется, если таблица открыта для просмотра).
1. В таблице **Product** удалите первичный ключ (он находится во вкладке *Ограничения*)
1. Сохраните изменения

1. В таблицу **Product** добавьте новую колонку (в контекстном меню *Колонки -> Создать объект колонка*), пока не включая авто инкемент (иначе потом невозможно создать первичный ключ).

В контекстном меню *Ограничения -> Создать объект оганичения* добавить первичный ключ на созданное поле

Сохраните изменения
Добавьте авто инкремент и снова сохраните

1. В таблице **OrderProduct** удалите поле *ProductArticleNumber*, ограничения и внешние ключи (поле не даёт удалять, пока есть ограничение, ограниение не даёт удалять пока есть внешний ключ...).

1. Создайте поле **ProductID** и добавьте внешние ключи для полей **OrderID** и **ProductID**

Получилось очень сложно, проще всё это поправить в скрипте ДО его выполнения (и даже не нужно особенно знать синтаксис **SQL** - в скрипте уже все команды написаны).
## Проверка исходных данных
Для импорта у нас есть 4 файла: `user_import.xlsx`, `Заказ_import.xlsx`, `Пункты выдачи_import.xlsx` и `Товар_import\Товар_import_Столовые приборы.xlsx`
Чтобы определиться, в каком порядке их импортировать, нужно читать задание. Там сказано, что сначала нужно показать окно авторизации, а затем список продукции. Таким образом, первыми мы будем импортировать `user_import.xlsx` и `Товар_import\Товар_import_Столовые приборы.xlsx`
* `user_import.xlsx` - в этом файле нужно разбить ФИО на составные части. И в **excel** и в **SQL** есть методы разбиения строки на части, но конкретно здесь проще выделить руками (10 строк).
* `Товар_import_Столовые приборы.xlsx`
- в структуре БД нет полей для "Единица измерения", "Размер максимально возможной скидки", "Поставщик"
- Поля "Категория", "Производитель" и "Поставщик" должны быть словарями
# Задание
* исправить скрипт создания БД (создать недостающие таблицы и связи) и выполнить его
>Переименуйте таблицы, которые у вас уже есть в БД
* импортировать данные из файлов `user_import.xlsx` и `Товар_import_Столовые приборы.xlsx`