[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обновление данных
braindbrigada
Доброй ночи.

Нужно следующее: Есть массив с ид и принадлежащей ему ценой.

Как обновить цену у каждого ид одним запросом?

Нужен пример запроса.
AllesKlar
формировать длинный запрос с CASE WHEN THEN

_____________
[продано копирайтерам]
paul85
Я считаю лучше сформировать временную таблицу, и записать данные сначала туда.
Потом обновить одну таблицу по другой через JOIN. Записывать во временную таблицу очень желательно "пакетами" по 100 строк, скажем.

Пример пакета:
INSERT INTO tempprice
(example_id, name, value, other_value)
VALUES
(100, 'Name 1', 'Value 1', 'Other 1'),
(
101, 'Name 2', 'Value 2', 'Other 2'),
(
102, 'Name 3', 'Value 3', 'Other 3'),
(
103, 'Name 4', 'Value 4', 'Other 4');

А вот запрос обновления (пример):
UPDATE product AS temp1
INNER JOIN
tempprice AS temp2
ON
temp1.product_partnumber = temp2.tempprice_partnumber
SET
temp1.product_price = temp2.tempprice_price;
sergeiss
Делаем 2 шага:
1. Триггер вставки. Он проверяет, что если строка существует (по каким-то ключевым параметрам), то апдейтит существующую. По сути, аналог ON DUPLICATE KEY UPDATE из Мускуля, только с бОльшими возможностями.
2. Нужные данные сохраняются в виде текстового файла с разделителями, затем заливаются ОДНОЙ КОМАНДОЙ вставки. Будь их там хоть 1 млн. строк, всё равно одной командой пройдет. Для каждой строки сработает триггер и данные либо вставятся, либо проапдейтятся.

При большом количестве данных иногда имеет смысл отключить ключи на время вставки, либо вообще их удалить и потом создать заново.

Работает всё прекрасно в моем любимом Постгре, и обязано работать в Мускуле. Впрочем, и в MSSQL тоже, как и в других видах полноценных БД.

И не надо будет никаких "пакетов по 100 команд" и врЕменных таблиц в БД. И не надо никаких "танцев с бубнами" вокруг CASE WHEN THEN.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
paul85
sergeiss, триггер + временный файл, ИМХО гораздо больший гемор, чем таблица. Во-вторых заливать большие объемы одним пакетом плохо, поскольку нагрузим СуБД на неопределенный срок. И в этот момент пользователям, возможно, будет выводится 504, либо просто timeout. Файл - тот же самый пакет, только очень-очень большой. И кстати на него есть ограничения (на пакет) - именно поэтому большие дампы иногда между серверами не заливаются. Разная максимальная длина.

А вот CASE WHEN THEN действительно неудобно.
AllesKlar
Цитата
CASE WHEN THEN

был дан ответ на конкретно поставленный вопрос.
Цитата
Как обновить цену у каждого ид одним запросом?


_____________
[продано копирайтерам]
Valick
AllesKlar
INSERT INTO `table` (`id`, `price`) VALUES(1,1000),(2,2000) ON DUPLICATE KEY UPDATE `price` = VALUES(`price`)



_____________
Стимулятор ~yoomoney - 41001303250491
braindbrigada
Всем ответившим спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.