MySQL увеличивает значение атрибута - иногда отсутствует (?) - PullRequest
0 голосов
/ 15 сентября 2009

В моей таблице A есть столбец с именем views. Я хочу увеличить столбец views следующим образом:

UPDATE A set views = views + 1 WHERE ID = blabla LIMIT 1;

Это похоже на способ сделать это, по крайней мере, для меня. Или так я думал.

Похоже, когда я (из PHP) делаю:

$views = get_viewcount($id);
$views++:
save_viewcount($id, $views);  //here we just update views with the $views variable

Это всегда работает. Но влечет за собой штраф за дополнительное обращение к БД с помощью get_viewcount, а затем увеличивает его в PHP и отправляет обратно. Это всегда работает.

Выражение SQL выше "иногда" работает. Я знаю - я тоже ненавижу слово «иногда» в программировании - но, говоря иначе, я не могу сказать КОГДА, но иногда оно не увеличивается, когда я делаю это в SQL напрямую за один раз.

Предложения

Ответы [ 4 ]

2 голосов
/ 15 сентября 2009

Вы, должно быть, делаете что-то не так.

Если вы скажете mysql:

UPDATE foo SET views = views+1 WHERE id = 1337;

это будет увеличивать его.

Попробуйте в командной строке.

Сбой любого кода, который вы используете для запуска sql, а не самого оператора sql.

А какой смысл LIMIT = 1 в запросе UPDATE?

2 голосов
/ 15 сентября 2009

Вам необходимо изолировать ошибку в вашей системе. очень маловероятно быть проблемой с MySQL.

Я бы предложил запустить массу тестов, просмотреть журналы базы данных и т. Д. Скорее всего, запрос просто не выполняется из-за некоторой логики в вашей системе или из-за того, что запрос умирает / завершается до того, как он достигает запрос.

0 голосов
/ 15 сентября 2009

Я бы посмотрел, где и когда вы выполняете обработку BEGIN TRANSACTION / COMMIT.

Возможно, вы не проверяете код возврата SQL и пропускаете предупреждение "DEADLOCK".

0 голосов
/ 15 сентября 2009

Что я рекомендую сделать, так это настроить PHP на отображение запроса, который он выполняет, результата, который он возвращает, и т. Д., И т. Д. Все, что вы можете. Посмотрите журналы SQL, если это применимо, чтобы увидеть, какие запросы выполняются для каких таблиц. В основном вам нужно точно увидеть , где точка сбоя это.

Когда вы утверждаете, что оператор SQL иногда работает, это на основе вызова из вашего кода или вызова через приглашение mysql (предполагается, что вы используете)? Если это предыдущий, пытались ли вы запустить его в командной строке, чтобы увидеть, получаете ли вы тот же результат, что и ваш код? Если нет, то вы можете исключить базу данных и начать смотреть конкретно на ваш код.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...