За последние 24 часа нас посетил 34521 программист и 1695 роботов. Сейчас ищут 872 программиста ...

массовое обновление записей MYSQLi

Тема в разделе "MySQL", создана пользователем A41524567, 18 июл 2014.

  1. A41524567

    A41524567 Активный пользователь

    С нами с:
    31 янв 2013
    Сообщения:
    74
    Симпатии:
    0
    Как грамотно решить проблему - обновление 200-300-400 записей за один раз???
    Заказчик стоит на своем - все сразу отредактировать, и в один клик сохранить.
    Хостер - просто предупреждает - блокировку за перегрузку сделает.
    Не хочется по частям сохранять, админом на самом сайте "блондинка", проблем много будет.... И красиво получается в админке - все интуитивно понятно....
    HELP - как за раз обновить много записей в MYSQLi
    Погуглил - у каждого свой "рецепт", но некоторые статьи просто мхом поросли, особого доверия не вызывают по дате написания.
    Гуру - направьте на путь истинный
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    что значит обновить?
    обновить счетчики по формуле - это одно.
    обновить контент - фильтром - другое.
    заменить контент вообще - третье. тут может нехватить позвожностей самой БД.

    вы что конкретно хотите сделать?
     
  3. A41524567

    A41524567 Активный пользователь

    С нами с:
    31 янв 2013
    Сообщения:
    74
    Симпатии:
    0
    Практический заменить весь контент каждой записи, остается только несколько полей нетронутыми
     
  4. alexforce2

    alexforce2 Активный пользователь

    С нами с:
    25 дек 2013
    Сообщения:
    71
    Симпатии:
    12
    Может подготовить запрос, а потом в цикле апдейтить записи таблицы?
     
  5. Хыиуду

    Хыиуду Активный пользователь

    С нами с:
    3 июн 2014
    Сообщения:
    618
    Симпатии:
    5
    А что мешает просто составить большой и толстый запрос?
    update table1 set field1 = 1, field2 = 'abc' where id = 1;
    update table1 set field1 = 5, field2 = 'wwww' where id = 3;
    ....
    И отправить одним запросом в базу.
     
  6. A41524567

    A41524567 Активный пользователь

    С нами с:
    31 янв 2013
    Сообщения:
    74
    Симпатии:
    0
    Вариантов куча: транзакции, буферная таблица, толстый запрос....
    А как грамотно?
     
  7. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Правильным будет уйти на VPS и послать к чертям хостера с его ограничениями.
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Во-первых, можно использовать multi_query. Это в десятки раз экономичнее отдельных запросов.
    Во-вторых, для обновления данных можно воспользоваться оператором REPLACE вместо UPDATE. Синтаксически он аналогичен INSERT, а значит можно все 400 строк уместить в один запрос.
     
  9. Ke1eth

    Ke1eth Активный пользователь

    С нами с:
    16 мар 2012
    Сообщения:
    1.073
    Симпатии:
    11
    Адрес:
    заблудилса
    Код (Text):
    1.  
    2. UPDATE mytable SET title = CASE
    3. WHEN id = 1 THEN 'Значение';
    4. WHEN id = 2 THEN 'Новое значение';
    5. ELSE title
    6. END;
    или я не правильно понял ТС?
     
  10. A41524567

    A41524567 Активный пользователь

    С нами с:
    31 янв 2013
    Сообщения:
    74
    Симпатии:
    0
    Спасибо всем отвечавшим. Вроде получилось! Для контроля увеличил в два раза количество строк для замены, сервер справляется.
    Что и как сделал ( на ГУРУ не претендую... только мое мнение + реальные результаты )
    Количество параметров "name" на странице не бесконечно, можно конечно попробовать добраться и изменить настройки, связываться не захотел.
    multi_query - не хватает его, 10-20 запросов в одном обращении отрабатывает, на большом количестве отказ.

    Этот пример вообше не смог запустить в мускуле, матюкается он про ошибки синтаксиса
    Код (Text):
    1. UPDATE mytable SET title = CASE
    2. WHEN id = 1 THEN 'Значение';
    3. WHEN id = 2 THEN 'Новое значение';
    4. ELSE title
    5. END;
    Получилось так:
    Код (Text):
    1. UPDATE block_content SET sorting = ELT(FIELD(`id`, 9,12, 18), 900,1200,1800) WHERE `id` IN (9,12,18)
     
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    для многострочного апдейта можно воспользоваться insert…on duplicate update.

    указываем в списке обновляемых полей первичный ключ и те поля которые реально обновляются.
    http://stackoverflow.com/questions/3432/multiple-updates-in-mysql
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    разница между insert…on duplicate update и replace в том, что первый делает реальный апдейт существующих строк, а второй сначала удаляет существующую строку, затем вставляет новую.