@bysobi

Как сделать МАССОВЫЙ UPDATE SQL запрос В ОДНУ СТРОКУ?

Есть проблема. У меня в цикле идет обновление 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... но так и не смог понять, как это применить в моем случае.
  • Вопрос задан
  • 8248 просмотров
Решения вопроса 1
TheRonCronix
@TheRonCronix
1. Сделать это в один запрос можно путем использования промежуточной таблицы. Сначала загрузите в БД данные из файла в эту таблицу, а затем одним запросом проведите update. Не забудьте собрать статистику на таблице после загрузки данных в нее из файла.
2. Без вспомогательной таблицы: вам нужен индекс на поля sku, upc. Но это будет не в один запрос.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Делайте уникальный ключ по (upc, sku). Затем
INSERT INTO `product` (`upc`, `sku`, `price`, `price_retail`)
  VALUES (:upc1, :sku1, :price1, :price_retail1), ..., 
         (:upcN, :skuN, :priceN, :price_retailN)
  ON DUPLICATE KEY UPDATE `price` = VALUES(`price`), 
    `price_retail` = VALUES(`price_retail`)

Только следите за длиной строки запроса, переменная max_allowed_packet

Ещё вариант - использовать подготовленный запрос. Один раз перед циклом делается prepare и bind, затем на каждом шаге execute. Экономия идёт на компиляции запроса.
Ответ написан
@InoMono
Bulk Insert - как раз для массового залития данных
Ответ написан
@d-stream
Готовые решения - не подаю, но...
А откуда берутся данные для update?
Если из других таблиц или регулярных данных - то все это элементарно делается в виде "однострочного" действия (update) за один раз.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы