Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Множественное обновление таблицы (Евгений) 04/01/2014 - 20:08:10
      Re: ... обменяю национальность на две судимости (Akina) 04/01/2014 - 22:33:43
      Re: ... обменяю национальность на две судимости (Евгений) 04/01/2014 - 23:17:18
      Re: Методика? есть её у нас... (Akina) 04/01/2014 - 23:46:43
      Re: Методика? есть её у нас... (Евгений) 05/01/2014 - 01:22:33
      Re: Методика? есть её у нас... (Akina) 05/01/2014 - 19:23:23
      Re: Обидно... (Евгений) 05/01/2014 - 20:02:05
      Re: Какой вопрос - такой и ответ. (Akina) 05/01/2014 - 23:25:58
      Re: Какой вопрос - такой и ответ. (Евгений) 06/01/2014 - 17:29:48
      Re: Какой вопрос - такой и ответ. (Akina) 06/01/2014 - 22:38:32

> Original message text:
> From: Евгений - 04/01/2014 - 20:08:10
> Subject:Множественное обновление таблицы
> -----------------
> Здравствуйте! Нужно произвести обновление многих записей одной таблицы. Когда производил это средствами цикла PHP выходило долго и порой не все данные обновлялись.
> Нашел информацию по множественному обновлению одним запросом, сформировал запрос, но данные вообще не обновляются (хоть и запрос выполняется без ошибок).
> Возможно вы натолкнете меня на правильный путь?
>
> Вот код запроса который я формировал:
> UPDATE users SET d2l_rep=CASE WHEN steam_id=76561198100699401 THEN 15 WHEN steam_id=76561198038877638 THEN 18 WHEN steam_id=76561198086741170 THEN 15 WHEN steam_id=76561198083334299 THEN 12 WHEN steam_id=76561198005564667 THEN 13 WHEN steam_id=76561198042284011 THEN 14 WHEN steam_id=76561198094077697 THEN 18 WHEN steam_id=76561198087150269 THEN 11 WHEN steam_id=76561198052823224 THEN 12 WHEN steam_id=76561198107634397 THEN 19 WHEN steam_id=76561198075534649 THEN 10 WHEN steam_id=76561198073823177 THEN 17 WHEN steam_id=76561198033238142 THEN 14 WHEN steam_id=76561197961571210 THEN 16 WHEN steam_id=76561198071119379 THEN 13 WHEN steam_id=76561198052609240 THEN 15 WHEN steam_id=76561198092766371 THEN 12 WHEN steam_id=76561198090268919 THEN 7 WHEN steam_id=76561198108217513 THEN 12 END WHERE steam_id IN (76561198100699401, 76561198038877638, 76561198086741170, 76561198083334299, 76561198005564667, 76561198042284011, 76561198094077697, 76561198087150269, 76561198052823224, 76561198107634397, 76561198075534649, 76561198073823177, 76561198033238142, 76561197961571210, 76561198071119379, 76561198052609240, 76561198092766371, 76561198090268919, 76561198108217513)
>


From: Akina - 04/01/2014 - 23:46:43
Subject:Методика? есть её у нас...
-----------------
Не надо статьи, чтобы понять одну простую мысль - любое действие следует выполнять инструментом, который предназначен для выполнения этого действия.

ПХП предназначен для приёма сырых исходных данных, их обработки и приведения к стандартной формализованной форме, формирования задания на изменение данных SQL-сервером, принятия результата обработки данных и формирования читабельного вида (представления) результата пользователю.

SQL предназначен для хранения и обработки формализованных массивов данных.

Итак, задача известна. "Есть массив (РНР) вида ключ=>значение. Нужно найти запись в которой поле steam_id равно ключу массива. И заменить в этой записи поле d2l_rep на значение этого ключа." Как мы видим, приём исходных данных и их стандартизация/формализация уже выполнены. Теперь наступает этап формирования задания серверу хранения и обработки данных (MySQL) на выполнение операции.

Серверу надо передать две порции данных. Первая - это дополнительные исходные данные для выполнения операции. Т.е. тот самый массив steam_id=>d2l_rep. Вторая - это инструкции по обработке данных.

Сделать это можно либо по разделениям (сперва данные, потом инструкции), либо одновременно (данные в инструкции).

Вы пошли по второму пути. Понимаю, почему - формально он проще. Однако там есть куча подводных камней. Назову два самых крупных булыжника.
1) У сервера есть такой параметр, как маскимальный размер принимаемого пакета. Для упрощения понимания - это почти что длина (в байтах) запроса, который может принять к выполнению сервер. Если запрос больше хоть на один байт - он не будет выполнен.
2) Если хотя бы какая-то часть запроса вызывает ошибку (скажем, одна пара данных) - не выполнится весь запрос.
Есть и ещё камни - вроде невозможности получения вменяемой диагностики в таких случаях...

Потому я предлагаю второй путь. Отдельно отослать данные, затем отдельно - инструкции на обработку. Данные можно отсылать как SQL-запросами, так и минуя их - скажем, слить в CSV, переправить файл по FTP на сервер (если PHP и MySQL расположены на разных серверах), где пакетно загрузить. А запрос на изменение будет коротким, простым и понятным...

И да - phpmyadmin есть не более чем бесконечно глючная поделка. Уже сколько народу наелось! Верить ему (и даже просто использовать его в разработке) надо поосмотрительнее... Соберите модель сервера на виртуалках, и там пробуйте - всё то же, но есть доступ к консоли и полный доступ к логам и отладке.


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
42992



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |