Как обновить много записей в БД (пошагово)?

Статус
В этой теме нельзя размещать новые ответы.

danneo

Честный
Регистрация
13 Ноя 2007
Сообщения
1.527
Реакции
121
Нужно обновить много записей в MySQL. Сначала делается выборка из БД, и она большая. Далее по каждой записи получаются еще данные. Итого сформируется много id-шников. И через foreach делаю UPDATE. Но за раз как-то не ахти делать. Видел в CMS функционал, типа "обновить статистику категорий" или же пошаговое обновление движков. Нужно сделать так, чтобы за раз выполнялось, например, 100 UPDATE, вывести результат, что они выполнились, а далее снова запускается автоматом другой ряд id-шников. И так, пока они есть.
Не понятно как это сделать пошагово, автоматом, типа refresh'а. Где данные хранить и как?
 
Код:
update test_table set title = 'Одинаковый заголовок в 5 строках, где id больше 1, но меньше 6' where id > 1 AND id < 6;
такое не покатит?
 
Код:
update test_table set title = 'Одинаковый заголовок в 5 строках, где id больше 1, но меньше 6' where id > 1 AND id < 6;
такое не покатит?
нет, т.к. это не про то... Нельзя обновить одним запросов сразу несколько записей таблицы.
сначала выбирается пару тысяч записей, у них берутся данные. По этим данным делается сборка других данных (из файлов). И так получается еще больше id-шников. А потом нужно пройти по всем этим id, именно по каждому, т.к. у них будут обновляться разные данные, в одних и тех же полях.
И вопрос скорее в том, как делать подряд много запросов, чтобы сервак не рухнул?
 
Первоначальным запросом выбирать не сразу все айдишники, а какую-нибудь часть. Параметры хранить - например в гет запросе. Т.е. идет запрос скрипта - смотрим на гет параметры. Ничего нет - значит берем первую тысячу, и делаем редирект на себя же, но в гет параметры добавляем эту тысячу. Т.е. запрашиваем скрипт script.php?start=1000 например. Тысяча айдишек обработалась - скрипт выводит в браузер "Окей, первую тысячу обработали.", и кусочек яваскрипта, который через 5 секунд средиректит на вторую тысячу - т.е. script.php?start=2000 например. :) ну и понеслась. Таким образом - проецсс можно закончить почти в любой момент, и продолжить почти с любого момента. Только, если эти запросы будут делаться не всеми подряд, т.к. дернув этот скрипт 10к раз одновременно - можно будет и положить сервер например.. :) Вобщем, надо грамотно продумать лимиты. Да, таким же образом - можно запустить обработку в несколько потоков, просто открыв нужное количество окон браузера, с нужными параметрами. :) Помимо гета - данные можно хранить так же в сессии.
 
Для просмотра ссылки Войди или Зарегистрируйся
INSERT INTO table ("name_уникального_ключа","value_что_нуна_вставить") VALUES (1,3)
ON DUPLICATE KEY UPDATE "value_что_нуна_вставить"="своё значение";

INSERT INTO lottery (id, journal_code)
(SELECT key_id,value FROM table)
ON DUPLICATE KEY UPDATE lottery.journal_code = VALUES(journal_code);

SELECT key_id,value FROM table - можно заменить на перечисление данных (Синтаксис как в INSERT)
Вот тебе и множественный апдейт
Если такого ключа нет - он вставиться с новым значением
Если ключ есть - просто обновиться значение у этого ключа

Адын запрос :)
 
Последнее редактирование модератором:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху