Добавлено: Чт, 15 Янв, 2009 20:01 Заголовок сообщения: [SQL] много UPDATE одним запросом.
Изначально предполагалось, что подготовка данных для запроса будет идти намного дольше самого запроса,
однако. Оказалась, что это не так, и время запроса на большOй по объему БД оказалось сравнимо с временем его подготовки.
В связи с этим, хочется сократить это время, объединив множество в одно обращение.
ну, тарифы мои вы знайте.
:1000 _________________ сервис DNS | разные http, DNS и прочие утилиты
UPDATE `test` SET `a`= CASE `id`
WHEN `id`=1 THEN '1'
WHEN `id`=2 THEN '2'
WHEN `id`=3 THEN '3'
WHEN `id`=4 THEN '4'
WHEN `id`=5 THEN '5'
WHEN `id`=5 THEN '6'
END
WHERE `id` IN(1,2,3,4,5,6);
Правильно ли я понял: запрос на update такой долгий, чтобы приходится ждать пока он выполнится, чтобы ввести новые данные?
Если да, тогда можно попробовать форкнуть процесс, пусть себе update выполняется в фоновом режиме.
хм... if работает ) а вот с кейсом я чота затупил... ща попробую...
upd:
ну чтоб не зануляло не перечисленные строки - надо дописать ELSE `field` перед END но всё равно заполняется только 1 строка... хммм... _________________
S|D|EG| Let's Rock! | XAP в ЛИЧКУ, SAPE
UPDATE `test` SET `a`= CASE
WHEN `id`=1 THEN '1'
WHEN `id`=2 THEN '2'
WHEN `id`=3 THEN '3'
WHEN `id`=4 THEN '4'
WHEN `id`=5 THEN '5'
WHEN `id`=5 THEN '6' ELSE `a`
END
WHERE 1
Обращу ваше внимание на то что после CASE не прописан `a` и после WHEN `id`=5 THEN '6' прописан ELSE `a` _________________
S|D|EG| Let's Rock! | XAP в ЛИЧКУ, SAPE
UPDATE `table` SET `field`= CASE `id`
WHEN `id`=1 THEN '111111111'
WHEN `id`=2 THEN '222222222' END
WHERE `id` IN(1,2)
Если я конечно вас правильно понял...
Ещё можно использовать if... но он для этой задачи не удобен...
Вот так бы выглядел этот код с IF:
Код:
UPDATE `table` SET `field`=IF(`id`=1,'111111111',IF(`id`=2,'222222222',`field`));
Развлекайтесь... (если я правильно понял )
Все хорошо, но что мне подсказывает, что такой кейс при большом кол-ве записей на update будет не оптимальным, ибо сначало он выберет кучу записей, потом будет проходить по всем этим записям и для каждой перебирать все варианты. А тупой вариант написать кучу update через ; не прокатит вроде бы это будет как один запрос в БД?
UPDATE `table` SET `field`=1 where `id`=1;UPDATE `table` SET `field`=2 where `id`=2; ? _________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)
Например, возможен такой вариант создать пользовательскую функцию mysql в которой записать логику изменений, это удобно если у вас изменения происходят по какой то системе, например если id > 10 то увеличиваем поле на 2, меньше на 3,5 и т.п. Потом функцию использовать для update. _________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)
Это точно будет работать быстрее когда процент изменяемых запросов очень велик так как он сможет быстро удалить все записи,а потом вставить новые, в идеале самое лучше когда можно убить все записи, а потом создать новые.
Так же вариант вставлять в новую таблицу просто insert'ами как описано выше, потом сделать со старой таблицей групповой запрос на объединение вида
Код:
insert into table1 values
SELECT * FROM table2 WHERE NOT EXISTS (SELECT id FROM table1
WHERE table1.id=table2.id)
Это имеет смысл при большом кол-ве изменений. _________________ Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)