|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
42992
|
|