Comments 16
Хм, спасибо за алерт! Как раз в четверг обновлять хотел — теперь заранее переберу шелы )
+1
Вы бы чтоли отформатировали как-нибудь запрос то по человечески — глаза же можно сломать, пока станет понятно, что тут к чему. Ну хотя бы как нибудь так:
UPDATE
xE_tvchannels_dyn AS t0,
xE_tvchannels_monthrating AS t1
SET
t0.ratingflushed = 1233522000,
t1.rating = t1.rating + t0.rating,
t0.totalrating = t0.totalrating + t0.rating,
t0.rating = 0
WHERE
t0.id = t1.cid AND
t1.month = '200902' AND
t0.rating > 0 AND
t0.ratingflushed <1233522000
* This source code was highlighted with Source Code Highlighter.
+26
Перепишите вообще не используя порядкозависимые выражения.
На этот случай в старой документации написано, что вообще никаких гарантий нет:
For multiple-table updates, there is no guarantee that assignments are carried out in any particular order.
это документация по 4.1 dev.mysql.com/doc/refman/4.1/en/update.html
И вообще странный вы способ избрали и не соответствующий духу SQL.
SQL выражает что вы хотите сделать с данными, а не как именно.
На этот случай в старой документации написано, что вообще никаких гарантий нет:
For multiple-table updates, there is no guarantee that assignments are carried out in any particular order.
это документация по 4.1 dev.mysql.com/doc/refman/4.1/en/update.html
И вообще странный вы способ избрали и не соответствующий духу SQL.
SQL выражает что вы хотите сделать с данными, а не как именно.
+4
Кстати да, язык SQL декларативный. Это предупреждение есть и в более новых версиях документации, вплоть до шестой — dev.mysql.com/doc/refman/6.0/en/update.html
Так что завтра порядок действий может еще раз измениться, так как предупреждали же :)
Так что завтра порядок действий может еще раз измениться, так как предупреждали же :)
+1
> Перепишите вообще не используя порядкозависимые выражения.
Как например?
Как например?
0
мож в 2 запроса?
0
Даже не знаю. Не заметил сначала зависимостей друг от друга.
В два запроса явно будет хуже, но может для вас это допустимо?
С переменными устроит? Конечно, это тоже отход от парадигмы sql, но без нее придется обновлять в два запроса или с подзапросом, что неоптимально.
Проверьте как будет работать если использовать переменную:
UPDATE
xE_tvchannels_dyn AS t0,
xE_tvchannels_monthrating AS t1
SET
@oldrating=t0.rating,
t0.ratingflushed = 1233522000,
t1.rating = t1.rating + @oldrating,
t0.totalrating = t0.totalrating + @oldrating,
t0.rating = 0
В два запроса явно будет хуже, но может для вас это допустимо?
С переменными устроит? Конечно, это тоже отход от парадигмы sql, но без нее придется обновлять в два запроса или с подзапросом, что неоптимально.
Проверьте как будет работать если использовать переменную:
UPDATE
xE_tvchannels_dyn AS t0,
xE_tvchannels_monthrating AS t1
SET
@oldrating=t0.rating,
t0.ratingflushed = 1233522000,
t1.rating = t1.rating + @oldrating,
t0.totalrating = t0.totalrating + @oldrating,
t0.rating = 0
0
не, с переменными тоже ничего хорошего
The general rule is never to assign a value to a user variable in one part of a statement and use the same variable in some other part of the same statement. You might get the results you expect, but this is not guaranteed.
The general rule is never to assign a value to a user variable in one part of a statement and use the same variable in some other part of the same statement. You might get the results you expect, but this is not guaranteed.
0
> За операцию перевода текущего рейтинга в месячный и в суммарный отвечает простенький запрос, который запускается раз в сутки
Раз в сутки можно и два запроса вместо одного сделать (зато заведомо верных).
Вообще наличие подобной проблемы может указывать на ошибки в логике.
Раз в сутки можно и два запроса вместо одного сделать (зато заведомо верных).
Вообще наличие подобной проблемы может указывать на ошибки в логике.
0
0
Sign up to leave a comment.
Особенность оптимизатора MySQL 5.1.30 порядок следования таблиц в UPDATE