Требуется MYSQL-запрос с хорошей производительностью для обновления и импорта данных, если это НЕ соответствует критериям, переместится в другую таблицу

У меня есть база данных, состоящая из:

  • loaddata_temp Стол (мой основной стол);
  • error_data Таблица;
  • company_category Таблица;
  • company_industry Таблица;
  • company_level Таблица;
  • company_type Таблица;

вот мой основной стол (loaddata_temp)

company_id  company_name                         company_parent_id  company_type_id  company_category_id  company_industry_id  company_level_id
----------  -----------------------------------  -----------------  ---------------  -------------------  -------------------  ----------------
2  A Plus Lawn Care                                     0          Partner                   PT                  ATL       Head office
3  A. L. Price                                          0          Partner                   CV                  ATL       Head office
4  A.J. August Fashion Wear                             0          Partner                   UD                  ATL       Head office
5  A+ Electronics                                       0          Partner             KOPERASI                  LAT       Head office
6  A+ Investments                                       0         Customer               Warung                  AAA       CITY OFFICE
7  Aaronson Furniture                                   0            OTHER                   PT                  ATL       Head office
8  ABC Markets                                          0             Test                   CV                  ATL       Head office

основная таблица имеет 8 столбцов первичного ключа.company_parent_id,company_category_id и так далее (каждый столбец, содержащий _id, является primary_key)

вот одна из моих справочных таблиц

company_type_id  company_type_description
---------------  ------------------------
1  Costumer
2  Partner
3  Other
18  Competitor

Справочная информация о том, что мне нужно для импорта данных из CSV в Mysql:

Я следую этому коду, чтобы импортировать тысячи данных из CSV.

http://www.softwareprojects.com/resources/programming/t-how-to-use-mysql-fast-load-data-for-updates-1753.html

ссылка выше действительно помогает мне улучшить мой запрос (спасибо Dawn Rossi)

перед вставкой в ​​реальную таблицу (company), мне нужно проверить или преобразовать первичный ключ в loaddata_temp в id.refference из другой таблицы, как company_category,company_industry и так далее.

поэтому я сделал следующий код ниже.

 $sql_updates[]="UPDATE company
LEFT JOIN   loaddata_temp
ON      company.company_name = loaddata_temp.company_name
SET     loaddata_temp.company_name = COALESCE( concat('Error Found Duplicate ',loaddata_temp.company_name),loaddata_temp.company_name)";

$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN   demography_country
ON  demography_country.demography_country_name = loaddata_temp.demography_country_id
SET     loaddata_temp.demography_country_id = COALESCE(demography_country.demography_country_id, concat('Error ',loaddata_temp.demography_country_id,' Your Country Not In the List'))";

$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN   demography_city
ON  demography_city.demography_city_name = loaddata_temp.demography_city_id
SET     loaddata_temp.demography_city_id = COALESCE(demography_city.demography_city_id,concat('Error ',loaddata_temp.demography_city_id,' : Your city Not In the List'))";

$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN   demography_provinces
ON  demography_provinces.demography_province_name = loaddata_temp.demography_province_id
SET     loaddata_temp.demography_province_id = COALESCE(demography_provinces.demography_province_id, concat('Error ',loaddata_temp.demography_province_id,' : Your Province Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN   company_type
ON  company_type.company_type_description = loaddata_temp.company_type_id
SET     loaddata_temp.company_type_id = COALESCE(company_type.company_type_id, concat('Error ',loaddata_temp.company_type_id,' : Your company Type Not In the List'))";
$sql_updates[]="UPDATE  loaddata_temp lt
LEFT JOIN   company_category cc
ON  cc.company_category_description = lt.company_category_id
SET     lt.company_category_id = COALESCE(cc.company_category_id, concat('Error ',lt.company_category_id,' : Your Company Category Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN   company_level
ON  company_level.company_level_description = loaddata_temp.company_level_id
SET     loaddata_temp.company_level_id = COALESCE(company_level.company_level_id,  concat('Error ',loaddata_temp.company_level_id,' : Your Company Level Not In the List'))";
$sql_updates[]="UPDATE loaddata_temp
LEFT JOIN   company_industry
ON  company_industry.company_industry_short_description = loaddata_temp.company_industry_id
SET     loaddata_temp.company_industry_id = COALESCE(company_industry.company_industry_id, concat('Error ',loaddata_temp.company_industry_id,' : Your Company Industry Not In the List'))";

из кода выше, результат

company_id  company_name                         company_parent_id  company_type_id  company_category_id  company_industry_id  company_level_id
----------  -----------------------------------  -----------------  ---------------  -------------------  -------------------  ----------------
2  A Plus Lawn Care                                     0                2                    3                    1                 1
3  A. L. Price                                          0                1                    4                    5                 1
4  A.J. August Fashion Wear                             0                2                    5                    7                 1
5  A+ Electronics                                       0                2                   23                Error                 1
6  A+ Investments                                       0                1                Error                Error            Errror
7  Aaronson Furniture                                   0                3                    3                    1                 1
8  ABC Markets                                          0            ERROR                    4                    1                 1

из приведенного выше результата, мне нужно отделить (переместить) данные с ошибкой в ​​таблицу error_data со следующим кодом.

INSERT INTO error_data
SELECT * FROM loaddata_temp
WHERE SUBSTRING_INDEX(company_name,' ',1)='Error' or
company_category_id REGEXP '^[A-Za-z \:]+$' OR
company_type_id REGEXP '^[A-Za-z \:]+$' OR
company_industry_id REGEXP '^[A-Za-z \:]+$' OR
company_level_id REGEXP '^[A-Za-z \:]+$' OR
demography_city_id REGEXP '^[A-Za-z \:]+$' OR
demography_country_id REGEXP '^[A-Za-z \:]+$' OR
demography_province_id REGEXP '^[A-Za-z \:]+$'

DELETE FROM loaddata_temp
WHERE SUBSTRING_INDEX(company_name,' ',1)='Error' or
company_category_id REGEXP '^[A-Za-z \:]+$' OR
company_type_id REGEXP '^[A-Za-z \:]+$' OR
company_industry_id REGEXP '^[A-Za-z \:]+$' OR
company_level_id REGEXP '^[A-Za-z \:]+$' OR
demography_city_id REGEXP '^[A-Za-z \:]+$' OR
demography_country_id REGEXP '^[A-Za-z \:]+$' OR
demography_province_id REGEXP '^[A-Za-z \:]+$'

Теперь в таблице loaddata_temp нет ошибки данных, поскольку она уже перемещена в таблицу error_data (см. Таблицу ниже).

company_id  company_name                         company_parent_id  company_type_id  company_category_id  company_industry_id  company_level_id
----------  -----------------------------------  -----------------  ---------------  -------------------  -------------------  ----------------
5  A+ Electronics                                       0                2                   23                Error                 1
6  A+ Investments                                       0                1                Error                Error            Errror
8  ABC Markets                                          0            ERROR                    4                    1                 1

Эта проблема

  • мне нужен запрос для отката таблицы error_data в таблицу ссылок или исходные данные без идентификатора (см. ниже)

    Идентификатор компании Идентификатор компании Идентификатор компании Родительский идентификатор компании Тип_идентификатора_идентификатора компании Идентификатор компании


     5  A+ Electronics                                       0          partner                   23                Error                 1
    6  A+ Investments                                       0         costumer                Error                Error            Errror
    8  ABC Markets                                          0            ERROR                    4                    1                 1
    
  • Мне нужно предложение обо всем моем коде выше, чтобы сделать его красивее и иметь хорошую производительность.

  • Если есть какая-либо ссылка ссылки, связанные с моей проблемой, пожалуйста, сообщите мне.

    Ваша помощь с благодарностью!

0

Решение

Давайте посмотрим, смогу ли я перефразировать вопрос … У вас есть файл CSV со строками (например, «Главный офис»), и вы хотите нормализовать эти значения в соответствии с таблицей нормализации, превратив эту строку в число (например, «3»). «)?

Далее файл CSV может есть новые строки, так что вам нужно INSERT новые пары строка-номер в таблице нормализации?

Затем вы хотите создать (или добавить) таблицу, в которой есть только идентификаторы (например, «3»), а не строки («Главный офис»).

Я обсуждаю очень эффективное решение 2-SQL для этой задачи в мой блог. Первый SQL обнаруживает и вставляет любые новые строки (INSERT ... SELECT ... LEFT JOIN ...). Второй обнаруживает все идентификаторы (UPDATE ... JOIN ... SET ...).

(Если это не суть вашего вопроса, то я должен жаловаться на отсутствие простоты / ясности.)

0

Другие решения

Других решений пока нет …