@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... но так и не смог понять, как это применить в моем случае.
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 5
  • 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. Экономия идёт на компиляции запроса.
    Ответ написан
  • @d-stream
    Готовые решения - не подаю, но...
    А откуда берутся данные для update?
    Если из других таблиц или регулярных данных - то все это элементарно делается в виде "однострочного" действия (update) за один раз.
    Ответ написан
  • @TheRonCronix
    1. Сделать это в один запрос можно путем использования промежуточной таблицы. Сначала загрузите в БД данные из файла в эту таблицу, а затем одним запросом проведите update. Не забудьте собрать статистику на таблице после загрузки данных в нее из файла.
    2. Без вспомогательной таблицы: вам нужен индекс на поля sku, upc. Но это будет не в один запрос.
    Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы