Подтвердить что ты не робот

Импорт CSV для обновления только одного столбца в таблице

У меня есть таблица, которая выглядит так:

products
--------
id, product, sku, department, quantity

В этой таблице содержится около 800 000 записей. Я получил новый CSV файл, который обновляет все количества каждого продукта, например:

productA, 12
productB, 71
productC, 92

Итак, примерно 750 000 обновлений (50 000 продуктов не изменились).

Мой вопрос: как мне импортировать этот CSV, чтобы обновлять только количество, основанное на значении product (уникальное), но оставить только теги sku, department и другие поля? Я знаю, как это сделать на PHP, перейдя через CSV и выполняя обновление для каждой отдельной строки, но это кажется неэффективным.

4b9b3361

Ответ 1

Вы можете использовать LOAD DATA INFILE, чтобы нагрузить 800 000 строк данных во временную таблицу, а затем использовать таблицу с несколькими таблицами UPDATE, чтобы присоединиться к существующей таблице во временную таблицу и обновить значения количества.

Например:

CREATE TEMPORARY TABLE your_temp_table LIKE your_table;

LOAD DATA INFILE '/tmp/your_file.csv'
INTO TABLE your_temp_table
FIELDS TERMINATED BY ','
(id, product, sku, department, quantity); 

UPDATE your_table
INNER JOIN your_temp_table on your_temp_table.id = your_table.id
SET your_table.quantity = your_temp_table.quantity;

DROP TEMPORARY TABLE your_temp_table;

Ответ 2

Я бы загрузил данные обновления в отдельную таблицу UPDATE_TABLE и выполнил обновление в MySQL, используя:

UPDATE PRODUCTS P SET P.QUANTITY=(
    SELECT UPDATE_QUANTITY
    FROM UPDATE_TABLE
    WHERE UPDATE_PRODUCT=P.PRODUCT
)

У меня сейчас нет MySQL под рукой, поэтому я могу отлично проверить синтаксис, возможно, вам нужно добавить LIMIT 0,1 во внутреннюю SELECT.