Экспорт из Excel и импорт в MySql

241
20 января 2022, 06:40

Есть огромная база в excel. Знаю, что можно тупо сохранить файл в csv и импортировать его в базу данных mysql. Но мне нужно разбить её на части. Условно линия выглядит так: производитель, имя товара, его характеристики. В таблице около 20к записей. Производитель и товар могут дублироваться много раз имея разные характеристики. Я хочу разбить это на три таблицы в mysql - company, product, characteristic. Для оптимизации убрать дубликаты - производителя и имени товара. Понимаю, что мне нужно привязать по id характеристики товара к названию товара, а название товара привязать по id к производителю. Сразу хочу сказать, что в mysql не силен. Выгрузить таблицу я могу. Как мне привязать всё по id между собой? Прошу пример, как это можно сделать с ссылкой на материал. Заранее спасибо.

Answer 1

До загрузки в БД вам надо привести данные в Excel. Это два разных процесса - нормализация данных и загрузка в MySql. Нормализировать данные в Excel можно таким образом:

  1. Копируете колонку с производителями на другой лист - будущая таблица производителей;
  2. Далее выделяете всю колонку с именами производителей и вызываете функцию "удалить дубликаты" - так вы получаете список уникальных значений производителей;
  3. Добавляете к производителям колонку ID, это просто номер по порядку каждого производителя;
  4. В вашей основной таблице добавляете колонку для идентификатора производителя, куда подтягиваете идентификатор с созданного ранее листа при помощи функции ВПР;
  5. Выделите эту колонку, скопируйте и сделайте "вставить только значения" - теперь вместо формул ВПР у вас значения идентификаторов производителей товаров;
  6. Удалите столбец с именами производителей.

Повторите этот алгоритм для всех полей которые хотите вынести.

Answer 2

Как мне привязать всё по id между собой?

Покажу на примере двух таблиц.

Пусть есть некий набор данных, вываленный в file.csv.

Создаём под них временную таблицу, и импортируем:

LOAD DATA INFILE "file.csv"
INTO TABLE temptable (full_fieldset);

Далее начинаем заполнять рабочие таблицы данными от корня дерева связей.

CREATE TABLE maintable (id_main SERIAL PRIMARY KEY, 
                        main_fieldset);
INSERT INTO maintable (main_fieldset)
SELECT DISTINCT main_fieldset FROM temptable;

После её заполнения дубли отсеяны, и каждая уникальная запись получила свой уникальный синтетический индекс.

Теперь заполняем зависимую таблицу. Данные берём из временной, а индекс для связи - из ведущей:

CREATE TABLE slavetable (id_slave SERIAL PRIMARY KEY, 
                         slave_fieldset,
                         id_main BIGINT,
                         FOREIGN KEY (id_main) REFERENCES maintable (id_main));
INSERT INTO slavetable (slave_fieldset, id_main)
SELECT temptable.fieldset, maintable.id_main
FROM temptable
NATURAL JOIN maintable;

И, собственно, всё...

Для упрощения процесса программирования весьма желательно соблюдать уникальность имён полей в пределах рабочего набора таблиц и соответствие имён полей во временной и рабочих таблицах. Т.е. в таблицах назначения одноимёнными являются только поля, по которым таблицы связываются, все остальные уникальны. Это позволяет использовать NATURAL JOIN и не составлять длинный список равенств в секции ON.

Answer 3

Убрал дубликаты компаний и записал их в новую таблицу. Сравнил id во временной(общей) таблице с таблицей компаний(без дубликатов). SELECT id FROM temp INNER JOIN company ON temp.companytemp = company.cname. Записал id в models.

READ ALSO
Как с помощью Python добавить инкрементируемый объект в MySQL?

Как с помощью Python добавить инкрементируемый объект в MySQL?

подскажите, пожалуйста: Есть таблица

166
Пауза между скриптами Js

Пауза между скриптами Js

есть 3 скрипта асинхронных, и каждый ждет другого, но выполняется он 1 минуту, и потом ничего не происходит, что и как поправитьЯ использую...

93
Vue - показать/скрыть элемент, генерируемый v-for

Vue - показать/скрыть элемент, генерируемый v-for

Какой самый лучший в VUE способ изменять видимость div в элементе li, который генерируется v-for ? Проблема в том, что приходят на ум какие то уж очень...

160
Задача codeWars. Различия решений задачи JavaScript

Задача codeWars. Различия решений задачи JavaScript

Возникла проблема в решении задачи из codeWarsСперва условие:

202