@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... но так и не смог понять, как это применить в моем случае.
  • Вопрос задан
  • 269 просмотров
Решения вопроса 1
  • @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. Экономия идёт на компиляции запроса.
    Ответ написан
  • @d-stream
    Готовые решения - не подаю, но...
    А откуда берутся данные для update?
    Если из других таблиц или регулярных данных - то все это элементарно делается в виде "однострочного" действия (update) за один раз.
    Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
Badoo Development Москва
от 140 000 до 180 000 руб.
ТК "Альфа" Тверь
от 40 000 до 60 000 руб.