(решил расширить комментарии выше и поместить его в ответ)
Я предлагаю создать набор промежуточных таблиц в вашей базе данных (по одной для каждого набора данных / файла).
Затем используйте LOAD DATA INFILE (или вставьте строки в пакетах) в эти промежуточные таблицы.Убедитесь, что вы удалили индексы перед загрузкой, и заново создайте то, что вам нужно после загрузки данных.
Затем вы можете сделать один проход по промежуточной таблице, чтобы создать отсутствующие основные записи.Например, предположим, что одна из ваших промежуточных таблиц содержит код страны, который должен использоваться в качестве masterID.Вы можете добавить основную запись, выполнив что-то вроде:
insert
into master_table(country_code)
select distinct s.country_code
from staging_table s
left join master_table m on(s.country_code = m.country_code)
where m.country_code is null;
Затем вы можете продолжить и вставить строки в «настоящие» таблицы, зная, что все строки сведений ссылаются на действительную основную запись.
Если вам нужно получить справочную информацию вместе с данными (например, перевод некоторого кода), вы можете сделать это с помощью простого объединения.Кроме того, если вы хотите отфильтровать строки по какой-либо другой таблице, теперь это также очень просто.
insert
into real_table_x(
key
,colA
,colB
,colC
,computed_column_not_present_in_staging_table
,understandableCode
)
select x.key
,x.colA
,x.colB
,x.colC
,(x.colA + x.colB) / x.colC
,c.understandableCode
from staging_table_x x
join code_translation c on(x.strange_code = c.strange_code);
Этот подход очень эффективен и очень хорошо масштабируется.Варианты вышеупомянутого обычно используются в части ETL хранилищ данных для загрузки огромных объемов данных.
Одно предостережение, касающееся MySQL, заключается в том, что он не поддерживает хеш-объединения, что является механизмом объединения, очень подходящим для полного объединения двух таблиц.Вместо этого MySQL использует вложенные циклы, что означает, что вам нужно для очень осторожного индексирования столбцов соединения.Таблицы InnoDB с их функцией кластеризации на первичном ключе могут помочь сделать это немного более эффективным.
И последнее замечание.Когда у вас есть промежуточные данные в базе данных, легко добавить некоторый анализ данных и отложить «плохие» строки в отдельной таблице.Затем вы можете проверить данные с помощью SQL вместо просмотра файлов CSV в вашем редакторе.