Имя динамического столбца между несколькими таблицами import mySQL

Я импортировал таблицу с именем book1 с именами столбцов: ID, 2018M01, 2018M02, 2018M03

Теперь мне нужно импортировать вторую таблицу с именем book2 с именами столбцов: ID, 2018M05, 2018M06, 2018M07

Между названиями столбцов из двух таблиц есть что-то похожее, то есть год префикса 2018.

Если возможно, я предпочитаю не писать эту часть кода для каждого имени столбца для каждой таблицы, как показано ниже.

CREATE TABLE book1 (
    ID VARCHARACTER(10),
    2018M01 decimal(4,2),
    2018M02 decimal(4,2),
    2018M03 decimal(4,2)
);

поскольку на самом деле в реальных таблицах есть несколько столбцов.

В приведенном ниже коде рассматривается первая таблица с некоторым кодом динамического раздела, однако мне нужна помощь для второй таблицы импорта.

DROP TABLE IF EXISTS book1;

CREATE TABLE book1 (
    ID VARCHARACTER(10),
    2018M01 decimal(4,2),
    2018M02 decimal(4,2),
    2018M03 decimal(4,2)
);

LOAD DATA LOCAL INFILE '/Users/blytonpereira/Desktop/Book1.csv' REPLACE INTO TABLE book1 
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;

SELECT
  GROUP_CONCAT(
    CONCAT(
      'SELECT id, ''', COLUMN_NAME, ''' as month, ', COLUMN_NAME, ' as QTY FROM t1 ') SEPARATOR ' UNION ALL ')
FROM
  `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE
  `COLUMN_NAME` LIKE '2018%'
INTO @sql;

SET @query = CONCAT('select id, month, QTY from (' , @sql , ') x order by id;');

SELECT @query;

 PREPARE stmt FROM @query;
 EXECUTE stmt;

Я бы хотел избежать явного определения имени столбца для каждого импорта. Каждый импорт, который я выполняю, похож, но немного отличается, то есть имена столбцов обновляются каждый раз, например. в первой таблице это 2018M01..2018M02 ... 2018M03 .... во второй таблице это 2018M02..2018M03..2018M04. Мне нужна помощь в написании этой второй части кода, где происходит импорт второго файла.

Я не понимаю, в чем твоя проблема. Если то, что вы опубликовали, работает для первой таблицы, похоже, вы на правильном пути. Где ты застрял?

Daniel Farrell 01.01.2019 02:35

Какая помощь вам нужна? С какой проблемой вы столкнулись с этим кодом?

Chetan 01.01.2019 02:36

@DanFarrell для ВТОРОЙ таблицы импорта из локального файла .csv, при импорте я могу использовать код LOAD DATA LOCAL INFILE, однако тогда мне нужно заранее создать таблицу в SQL (т.е. имена столбцов и т. д.). Я хочу, чтобы это было динамически, т.е. каждый раз, когда я создаю новый импорт, я не хочу определять имена столбцов в SQL, поскольку есть несколько столбцов, поэтому мне нужна помощь в написании этой части кода, продолжая то, что я уже написал

jackie21 01.01.2019 02:40

@ChetanRanpariya, пожалуйста, см. Изображение ibb.co/TbDwNmp Я бы хотел избежать явного определения имени столбца для каждого импорта. Каждый импорт, который я выполняю, похож, но немного отличается, то есть имена столбцов обновляются каждый раз, например. в первой таблице это 2018M01..2018M02 ... 2018M03 .... во второй таблице это 2018M02..2018M03..2018M04. Мне нужна помощь в написании этой второй части кода, где происходит импорт второго файла. Сходство в том, что год похож на 2018 год для имени столбца.

jackie21 01.01.2019 02:45

Вы знаете, что MySQL имеет жесткое ограничение для столбцов 4096 в качестве ограничения, но innoDB имеет ограничение в 1000? Кроме того, увеличение имен столбцов - отличный кандидат на нормализацию.

Raymond Nijland 01.01.2019 02:59
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
5
209
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это просто предложение, очевидно, без тестирования и с некоторыми внутренними предположениями.

Похоже, вы можете загрузить каждый файл в ОДНУ таблицу и, следовательно, избежать динамических имен столбцов. то есть вы игнорируете верхнюю строку, в которой, как я полагаю, есть имена столбцов

LOAD DATA LOCAL INFILE '/Users/blytonpereira/Desktop/Book1.csv' REPLACE INTO TABLE book1 
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;

Итак, «постановку» можно определить так:

CREATE TABLE book_staging (
    ID VARCHARACTER(10),
    MNTH_A decimal(4,2),
    MNTH_B decimal(4,2),
    MNTH_C decimal(4,2)
);

И вы можете настроить фиксированный запрос с параметрами, например

set @mnth_a = '2018M04';
set @mnth_b = '2018M05';
set @mnth_c = '2018M06';

select id, month, QTY 
from (
    SELECT id, @mthn_a as month, MNTH_A as QTY FROM book_staging WHERE MNTH_A IS NOT NULL
    UNION ALL 
    SELECT id, @mnth_b as month, MNTH_B as QTY FROM book_staging WHERE MNTH_B IS NOT NULL
    UNION ALL 
    SELECT id, @mnth_b as month, MNTH_C as QTY FROM book_staging WHERE MNTH_C IS NOT NULL
    ) x 
order by id, month
;

В конце каждого цикла загрузки файла промежуточная таблица может быть усечена или удалена (в зависимости от предпочтительного подхода), чтобы вы были готовы к следующему запуску.

Как наблюдение, имена столбцов, которые также являются именами функций или зарезервированными словами, болезненно использовать. Лично я бы не стал использовать имя столбца month. Точно так же я бы предпочел использовать настоящую дату, например, 2018-01-01, чем строку типа 2018M01, но могут быть и другие причины для использования этих строк, о которых я не знаю.

@usedbyalready. когда я загружаю следующий файл, предполагая, что его имя - Book2.csv .... Я могу просто пропустить часть СОЗДАТЬ ТАБЛИЦУ .... Я не совсем понимаю, что подразумевается под промежуточной частью, которую можно отбросить? Означает ли это, что нам нужна промежуточная часть только один раз, когда мы загружаем первый файл, и больше не нужно?

jackie21 01.01.2019 13:07

Основная цель моего предложения заключалась в том, чтобы избежать динамических столбцов. Промежуточная таблица может быть усечена или удалена, это зависит от вашего предпочтительного подхода.

Paul Maxwell 01.01.2019 23:16

Другие вопросы по теме