Массовый update в mysql в один запрос

302
09 февраля 2018, 18:24

Есть проблема. У меня в цикле идет обновление 30к+ строк. И тратится на это 40+ минут. То есть у меня в цикле выполняется такой запрос:

UPDATE product 
     SET price = $product['price'],
         price_retail = $product['price_retail'] 
WHERE upc = $product['supplier'] AND sku = $product['uniqCode']

И так происходит 30 тыс раз. Как можно это сделать в один запрос? Я видел примеры с Update ... case.. when... но так и не смог понять, как это применить в моем случае.

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

Поставщик Уникальный код Оптовая цена Розничная цена Остаток на складе

Apple ABC123 763$ 1171$ 5

В нем 30-70 тыс строк(Для каждого поставщика, а их 8+). В файле есть 2 поля(помимо полей с ценами), по которым я определяю товар в базе данных, это supplier(поставщик) и uniqCode(Уникальный код). Мне нужно именно ОБНОВИТЬ товар, а если его нету в базе, то вставлять не нужно(потому insert with no dublicate не подходит).

Answer 1
  1. Если у вас известен id product, лучше по нему строить where и соответветственно индекс должен быть.
  2. Можно обновлять записи в транзакции, к примеру по 1000 шт.
  3. Из кода не очень понятно $product['supplier'] и $product['uniqCode'] всегда разные. Побольше бы информации.
READ ALSO
исправления запроса mysql

исправления запроса mysql

каак можно исправить данный запрос

208
Отличия в структуре хранения данных в mysql и NoSql?

Отличия в структуре хранения данных в mysql и NoSql?

Есть таблица Area у не есть множество EventВ mysql это выглядит как 2 таблицы: Area -> Event, 1 -> много

220
Перевод базы данных из access в mysql

Перевод базы данных из access в mysql

Перевел из аксеса в эксель, потом экспортировал в тхтЗатем поменял расширение на dat при чтении слетает кодировка

256