Задать вопрос
@suhuxa1

Как сформировать 1 запрос UPDATE с тысячей значений?

Добрый день!
Раз в день у меня скрипт получает информацию (примерно тысячу строк в бд), которую надо в этой самой БД изменить. Проще говоря, это товары, у которых каждый день меняются цены. Приходит массив с ценами и айди товаров. Надо сформировать один UPDATE запрос, в котором будет что-то вроде: Товар А: цена = 500, доставка = 100. Товар Б: цена = 400, доставка = 50. И так далее. Около 1000 товаров так. По одному запросу посылать не вариант.
Заранее благодарю!
  • Вопрос задан
  • 651 просмотр
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!
Как сформировать 1 запрос UPDATE с тысячей значений?


Вот так, и так до 1000 (или сколько Вам будет нужно):
UPDATE table1
	SET val = CASE
		WHEN id = 1 THEN 10
		WHEN id = 2 THEN 20
		WHEN id = 3 THEN 30
	END
  -- тут ещё можно дописать условие, типа WHERE id IN (1,2,3)


По одному запросу посылать не вариант.
По моему, Вы пытаетесь вывернуть бедного дельфина наизнанку через за... Можно посылать много запросов за 1 раз, разделяя их ";" (точкой с запятой). Более того, их так же можно обернуть в транзакцию (как много запросов по одному, так и много запросов через ";").

P.S. Пример таблицы над которой проводились эксперименты: 078858d3885a4c2399df731018ed03e3.png (на всякий случай)
Ответ написан
Комментировать
@BorisKorobkov
Web developer
CREATE TEMPORARY TABLE ...;
INSERT INTO ... (...), (...), (...);
UPDATE ...;
DROP TEMPORARY TABLE ...;

Итого 4 запроса.
Ответ написан
Комментировать
dimonchik2013
@dimonchik2013
non progredi est regredi
см. тут , но сам запрос Update медленный, и от того, что впихнете все в одно выражение, быстрее не станет, скорее, наоборот

надо менять саму логику приложения - например столбец с датой и актуальными ценами, другое хранилище и т.п.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
Более-менее оптимальный вариант в близком решении (обновление прайсов на 0.5-20 миллионов позиций):

1. из внешнего источника данные втягиваются во временную таблицу
2. из временной таблицы в номенклатуру добавляются отсутствующие (новые) позиции
3. временная таблица прореживается на предмет дубликатов
4. временная таблица прореживается по ряду интерактивных условий (какие поля из нее использовать для обновления) - совпадающие удаляются
5. пачками делается update - именно пачками, специфичными для каждого экземпляра sql сервера с его загрузкой, объемом памяти, скоростью дисковой подсистемы и т.п.

экспериментальным путем - пришли где-то к размеру "пачки" в 50000...200000 строк

____________________________
* речь о достаточно универсальном средстве для импорта разных прайсов разных брендов = в одном случае есть закупочные и продажные цены + классификация по группам скидок, где-то только базовая цена и т.п.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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