EOMY.NET
Хостинг EOMY.NET: Форум поддержки
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
RSS Feed  

[SQL] много UPDATE одним запросом.
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB
[SQL] много UPDATE одним запросом.
Автор Сообщение
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 3840

111220 Монеты

СообщениеДобавлено: Чт, 15 Янв, 2009 20:01    Заголовок сообщения: [SQL] много UPDATE одним запросом. Ответить с цитатой

Изначально предполагалось, что подготовка данных для запроса будет идти намного дольше самого запроса,
однако. Оказалась, что это не так, и время запроса на большOй по объему БД оказалось сравнимо с временем его подготовки.
В связи с этим, хочется сократить это время, объединив множество в одно обращение.
ну, тарифы мои вы знайте.
:1000
_________________
сервис DNS | разные http, DNS и прочие утилиты
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DEXIF
#!/bin/bash
Согнул ложку


Зарегистрирован: 27.09.2006
Сообщения: 919
Откуда: Минск
49930 Монеты

СообщениеДобавлено: Чт, 15 Янв, 2009 21:18    Заголовок сообщения: Ответить с цитатой

В чём проблема
Код:
UPDATE `table` SET `field`= CASE  `id`
WHEN `id`=1 THEN '111111111'
WHEN `id`=2 THEN '222222222' END
WHERE `id` IN(1,2)

Если я конечно вас правильно понял...
Ещё можно использовать if... но он для этой задачи не удобен... Smile
Вот так бы выглядел этот код с IF:

Код:
UPDATE `table` SET `field`=IF(`id`=1,'111111111',IF(`id`=2,'222222222',`field`));

Развлекайтесь... (если я правильно понял Smile )
_________________


S
|D|EG| Let's Rock! | XAP в ЛИЧКУ, SAPE
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 3840

111220 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 07:43    Заголовок сообщения: Ответить с цитатой

не.
Первую строку обновляет, остальные нет.
Точнее обновляет, но на NULL
_________________
сервис DNS | разные http, DNS и прочие утилиты
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DEXIF
#!/bin/bash
Согнул ложку


Зарегистрирован: 27.09.2006
Сообщения: 919
Откуда: Минск
49930 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 07:54    Заголовок сообщения: Ответить с цитатой

O_O а как выглядит код?
_________________


S
|D|EG| Let's Rock! | XAP в ЛИЧКУ, SAPE
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 3840

111220 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 07:57    Заголовок сообщения: Ответить с цитатой

Код:
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);

_________________
сервис DNS | разные http, DNS и прочие утилиты
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
girafenok
Два пингвиненка
Два пингвина


Зарегистрирован: 17.11.2007
Сообщения: 333

11827 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 08:06    Заголовок сообщения: Ответить с цитатой

Правильно ли я понял: запрос на update такой долгий, чтобы приходится ждать пока он выполнится, чтобы ввести новые данные?
Если да, тогда можно попробовать форкнуть процесс, пусть себе update выполняется в фоновом режиме.

http://ru.php.net/manual/ru/function.pcntl-fork.php

Сразу предупреждаю, что распараллеливанием задач на php не занимался. Это только идея.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
DEXIF
#!/bin/bash
Согнул ложку


Зарегистрирован: 27.09.2006
Сообщения: 919
Откуда: Минск
49930 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 08:12    Заголовок сообщения: Ответить с цитатой

хм... if работает ) а вот с кейсом я чота затупил... ща попробую...

upd:
ну чтоб не зануляло не перечисленные строки - надо дописать ELSE `field` перед END но всё равно заполняется только 1 строка... Smile хммм...
_________________


S
|D|EG| Let's Rock! | XAP в ЛИЧКУ, SAPE
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 3840

111220 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 08:23    Заголовок сообщения: Ответить с цитатой

girafenok
нет распараллеливание не годится.
так как это скрипт-демон, который работает неделями.
_________________
сервис DNS | разные http, DNS и прочие утилиты
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DEXIF
#!/bin/bash
Согнул ложку


Зарегистрирован: 27.09.2006
Сообщения: 919
Откуда: Минск
49930 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 08:25    Заголовок сообщения: Ответить с цитатой

во рабочий вариант:
Код:
UPDATE `table` SET `field`= CASE
WHEN `id`=1 THEN '111111111'
WHEN `id`=2 THEN '2222222222'
WHEN `id`=3 THEN '33333333333' ELSE `field`
 END
WHERE 1


Можно и без WHERE 1 но это привычка Smile
_________________


S
|D|EG| Let's Rock! | XAP в ЛИЧКУ, SAPE
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 3840

111220 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 09:06    Заголовок сообщения: Ответить с цитатой

аналогиный результат.
_________________
сервис DNS | разные http, DNS и прочие утилиты
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
DEXIF
#!/bin/bash
Согнул ложку


Зарегистрирован: 27.09.2006
Сообщения: 919
Откуда: Минск
49930 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 09:34    Заголовок сообщения: Ответить с цитатой

странно... вы прописываете так? :
Код:
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
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
lazutov
while (1==1);
Последний герой


Зарегистрирован: 30.04.2007
Сообщения: 3840

111220 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 10:02    Заголовок сообщения: Ответить с цитатой

обновил mysql.
Заработало.
Мистика.
Но всеравно спасибо.
_________________
сервис DNS | разные http, DNS и прочие утилиты
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Веденин
Красные глаза
Красные глаза


Зарегистрирован: 17.05.2007
Сообщения: 2066
Откуда: Самара
11733 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 21:47    Заголовок сообщения: Ответить с цитатой

DEXIF писал(а):
В чём проблема
Код:
UPDATE `table` SET `field`= CASE  `id`
WHEN `id`=1 THEN '111111111'
WHEN `id`=2 THEN '222222222' END
WHERE `id` IN(1,2)

Если я конечно вас правильно понял...
Ещё можно использовать if... но он для этой задачи не удобен... Smile
Вот так бы выглядел этот код с IF:

Код:
UPDATE `table` SET `field`=IF(`id`=1,'111111111',IF(`id`=2,'222222222',`field`));

Развлекайтесь... (если я правильно понял Smile )

Все хорошо, но что мне подсказывает, что такой кейс при большом кол-ве записей на update будет не оптимальным, ибо сначало он выберет кучу записей, потом будет проходить по всем этим записям и для каждой перебирать все варианты. А тупой вариант написать кучу update через ; не прокатит вроде бы это будет как один запрос в БД?
UPDATE `table` SET `field`=1 where `id`=1;UPDATE `table` SET `field`=2 where `id`=2; ?
_________________
Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)

Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Веденин
Красные глаза
Красные глаза


Зарегистрирован: 17.05.2007
Сообщения: 2066
Откуда: Самара
11733 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 21:53    Заголовок сообщения: Ответить с цитатой

Например, возможен такой вариант создать пользовательскую функцию mysql в которой записать логику изменений, это удобно если у вас изменения происходят по какой то системе, например если id > 10 то увеличиваем поле на 2, меньше на 3,5 и т.п. Потом функцию использовать для update.
_________________
Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)

Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Веденин
Красные глаза
Красные глаза


Зарегистрирован: 17.05.2007
Сообщения: 2066
Откуда: Самара
11733 Монеты

СообщениеДобавлено: Пт, 16 Янв, 2009 22:07    Заголовок сообщения: Ответить с цитатой

Второй вариант это сначала удалить потом вставить записи, это удобно только если запись меняется целиком + мало индексов

Цитата:
DELETE `table` WHERE `id` IN(1,2,3,4);

INSERT INTO `tmptable` (`id`, `field`) VALUES
('1', '11111'),
('2', '22222'),
('3', '33333'),
('4', '44444');


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

Так же вариант вставлять в новую таблицу просто insert'ами как описано выше, потом сделать со старой таблицей групповой запрос на объединение вида
Код:

insert into table1 values
SELECT * FROM table2 WHERE NOT EXISTS (SELECT id FROM table1
         WHERE table1.id=table2.id)


Это имеет смысл при большом кол-ве изменений.
_________________
Написание конвекторов, парсеров, интеграции нескольких сайтов (в личку)

Тематические поисковые системы Рунета: Танцевальная, программиста, поиск книг
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail Посетить сайт автора
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов EOMY.NET -> Программирование для WEB Часовой пояс: GMT
На страницу 1, 2  След.
Страница 1 из 2

 


EOMY TOP 100 Rambler's Top100   Рейтинг@Mail.ru    



Powered by phpBB © 2001, 2005 phpBB Group


Рейтинг SIMPLETOP.NET