Xpoint
   [напомнить пароль]

Два UPDATE в одном запросе

Метки: [без меток]
2008-08-03 04:45:56 [обр] SunDey[досье]

Доброго времени суток.
Подскажите - можно ли посредством функции mysql_query выполнить два UPDATE

К примеру

mysql_query("UPDATE categories SET ordering=2 WHERE ordering=1;UPDATE categories SET ordering=1 WHERE id=15;", ....

спустя 9 часов [обр] Fenrir(0/3)[досье]
Нет, только с помощью mysqli_multi_query().
спустя 16 минут [обр] Алексей Севрюков(162/1280)[досье]
SunDey[досье] А какой в этом практический смысл?
спустя 7 часов [обр] Иван[досье]
Полагаю, что есть необходимоть в отмене этих UPDATE при сбое в запросе. Однако в этом случае, помимо mysqli могу предложить использование тразакций (при условии, что используется innoDB)
спустя 35 минут [обр] Алексей Севрюков(162/1280)[досье]
Иван[досье] Вот-вот, именно транзакции для этих целей. А mysqli_multi_query скорее всего просто разбивает запросы и затем выполняет через обычный mysql_query. Т.е. никаких преимуществ по сравнению с несколькими запросами не будет (ну только код короче, хотя преимуществом это сложно назвать).
спустя 15 часов [обр] SunDey[досье]
>А какой в этом практический смысл?
Ну я полагаю смысл в том что 1раз лезть в базу чем 2
спустя 5 минут [обр] Алексей Севрюков(162/1280)[досье]

SunDey[досье]

А mysqli_multi_query скорее всего просто разбивает запросы и затем выполняет через обычный mysql_query. Т.е. никаких преимуществ по сравнению с несколькими запросами не будет (ну только код короче, хотя преимуществом это сложно назвать).

Т.е. запроса все равно будет два, AFAIK. Так что никакой разницы не будет.
P.S. Не нужно пытаться сэкономить на таких мелочах, БД создана для того, чтобы принимать запросы и их обрабатывать.

спустя 2 часа 17 минут [обр] Thirteensmay(17/157)[досье]
Алексей Севрюков[досье] При всем уважении к Вам, позволю не согласиться. Думаю не стоит быть настолько категоричным. Функция mysqli_multi_query напрямую из себя вызывает mysql_real_query, которая является не функцией PHP а уже низкоуровневым C API MySQL, т.е. цепочка вызова наиболее коротка и оптимальна. Функция же mysql_query прежде чем добраться до mysql_real_query проходит через 2 обертки. Сей факт кроме вывода о замедлении работы, приводит к выводу что в случае mysqli_multi_query будет не 2 запроса, а скажем 1.9 ;) за счет экономии хотябы на сетевом транспорте и общеспецифичных действиях MySQL перед выполнением запроса. Функция mysql_real_query как это и подобает функциям СУБД совершенно свободно выполняет запрос с несколькими SQL командами разделенными ;, это управляется флагами. mysqli_multi_query эти флаги поднимает, а mysql_query - опускает. Конечно, на парсинг нескольких команд по разделителю, уходит некоторое время, однако это всеравно существенно быстрее, т.к. исполняется скомпиленным кодом и скопом (читай движком MySQL), а не интерпретатором и по одиночке (читай PHP). Таким образом думаю можно сделать вывод о том что при значительном количестве апдейтов можно получить заметный выигрыш, более того, один вызов вместо нескольких как вы сами заметили, просто короче по коду, что приятно, так что имеет смысл им пользоваться даже для небольшого количества команд. Однако все это конечно необходимо проверить экспериментально. SunDey[досье] Вот и поэкспериментируйте если есть желание ;)
спустя 6 часов [обр] Алексей Севрюков(162/1280)[досье]
Thirteensmay[досье] я плохо знаю PHP, с удовольствием почитал бы ссылку об отличии mysql_query от mysqli_multi_query. Я для этого и написал "AFAIK", потому что не до конца уверен.
спустя 10 часов [обр] Thirteensmay(17/157)[досье]
Гы, дык а я его вообще не знаю, ей богу ни строчки не написал. Однако сырцы достаточно элементарные ;)
спустя 1 день 3 часа [обр] Сергей Сирик(180/737)[досье]
Ну, +- "лезть в базу" оно и может привести к экономии, но идеологически не совсем правильно :) Выполнение каждого запроса индивидуально подразумевает индивидуальную же обработку ошибок и т.д.
спустя 11 минут [обр] Алексей Севрюков(162/1280)[досье]
Сергей Сирик[досье] Золотые слова. Да и код такой будет читать не очень удобно.
спустя 20 минут [обр] Thirteensmay(17/157)[досье]
В общем случае это верно, но если индивидуальная обработка ошибок не требуется (например потому что по условию задачи их не может быть в принципе, что бывает очень часто) то имхо всеже лучше заряжать пачку.
спустя 1 день 16 часов [обр] EugeneTM[досье]
А не проще сделать в данном случае хранимую процедуру в БД, в ней завернуть оба апдейта в транзакцию и не греть голову.
Быстрее все равно ничего выполняться не будет.
спустя 17 часов [обр] Сергей Сирик(180/737)[досье]
EugeneTM[досье]
Мускулю до адекватности хранимостей - процедур и триггеров - еще пару версий как минимум. Вроде как работает, но именно что "вроде как". Оттуда иногда такие глюки лезут ...
спустя 9 дней [обр] Филипп Ткачев(20/112)[досье]
А может переписать 2 запроса в 1 с использованием оператора IF?
UPDATE categories SET ordering = IF(ordering = 1,2,1) WHERE (ordering=1) OR (id=15)
спустя 1 час 19 минут [обр] Алексей Севрюков(162/1280)[досье]
Филипп Ткачев[досье] что-то не вникаю как в id=15 - ordering=1 попадет.
спустя 1 час 6 минут [обр] Филипп Ткачев(20/112)[досье]
Спасибо Алексей Севрюков за замечание. Я как обычно поторопился и не довел запрос до конца. В условии нужно IF(ordering=1 АND id!=15,2,1). В таком случае замена будет происходить правильно.
Powered by POEM™ Engine Copyright © 2002-2005