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

Тема в разделе "Как сделать...", создана пользователем danneo, 3 мар 2014.

Статус темы:
Закрыта.
  1. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    Нужно обновить много записей в MySQL. Сначала делается выборка из БД, и она большая. Далее по каждой записи получаются еще данные. Итого сформируется много id-шников. И через foreach делаю UPDATE. Но за раз как-то не ахти делать. Видел в CMS функционал, типа "обновить статистику категорий" или же пошаговое обновление движков. Нужно сделать так, чтобы за раз выполнялось, например, 100 UPDATE, вывести результат, что они выполнились, а далее снова запускается автоматом другой ряд id-шников. И так, пока они есть.
    Не понятно как это сделать пошагово, автоматом, типа refresh'а. Где данные хранить и как?
     
  2. Bezhev

    Bezhev

    Регистр.:
    26 дек 2012
    Сообщения:
    362
    Симпатии:
    123
    Код:
    update test_table set title = 'Одинаковый заголовок в 5 строках, где id больше 1, но меньше 6' where id > 1 AND id < 6;
    такое не покатит?
     
  3. danneo

    danneo Честный

    Регистр.:
    13 ноя 2007
    Сообщения:
    1.418
    Симпатии:
    109
    нет, т.к. это не про то... Нельзя обновить одним запросов сразу несколько записей таблицы.
    сначала выбирается пару тысяч записей, у них берутся данные. По этим данным делается сборка других данных (из файлов). И так получается еще больше id-шников. А потом нужно пройти по всем этим id, именно по каждому, т.к. у них будут обновляться разные данные, в одних и тех же полях.
    И вопрос скорее в том, как делать подряд много запросов, чтобы сервак не рухнул?
     
  4. Virtual

    Virtual Создатель

    Регистр.:
    17 фев 2007
    Сообщения:
    34
    Симпатии:
    9
    Первоначальным запросом выбирать не сразу все айдишники, а какую-нибудь часть. Параметры хранить - например в гет запросе. Т.е. идет запрос скрипта - смотрим на гет параметры. Ничего нет - значит берем первую тысячу, и делаем редирект на себя же, но в гет параметры добавляем эту тысячу. Т.е. запрашиваем скрипт script.php?start=1000 например. Тысяча айдишек обработалась - скрипт выводит в браузер "Окей, первую тысячу обработали.", и кусочек яваскрипта, который через 5 секунд средиректит на вторую тысячу - т.е. script.php?start=2000 например. :) ну и понеслась. Таким образом - проецсс можно закончить почти в любой момент, и продолжить почти с любого момента. Только, если эти запросы будут делаться не всеми подряд, т.к. дернув этот скрипт 10к раз одновременно - можно будет и положить сервер например.. :) Вобщем, надо грамотно продумать лимиты. Да, таким же образом - можно запустить обработку в несколько потоков, просто открыв нужное количество окон браузера, с нужными параметрами. :) Помимо гета - данные можно хранить так же в сессии.
     
    danneo нравится это.
  5. Arm45

    Arm45 Создатель

    Регистр.:
    14 фев 2014
    Сообщения:
    10
    Симпатии:
    0
    https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
    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)
    Вот тебе и множественный апдейт
    Если такого ключа нет - он вставиться с новым значением
    Если ключ есть - просто обновиться значение у этого ключа

    Адын запрос :)
     
    Последнее редактирование модератором: 17 мар 2014
Статус темы:
Закрыта.