MySQL的属性增量值 - 有时会错过(?)

时间:2009-09-15 08:27:48

标签: php mysql

我在表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对DB进行额外往返的惩罚,然后在PHP中递增它并将其发送回去。它总能奏效。

上面的SQL语句“有时”有效。我知道 - 我也讨厌编程中的“有时”这个词 - 但换句话说,我不能说WHEN,但有时当我在SQL中直接一次性地执行它时它不会增加它。

建议?

4 个答案:

答案 0 :(得分:2)

您需要隔离系统中的错误。对MySQL来说,问题非常不可能

我建议运行大量的测试,并查看数据库日志等。由于系统中的某些逻辑,或者由于请求在到达之前死亡/结束,查询很可能根本没有执行查询。

答案 1 :(得分:2)

你一定做错了。

如果你告诉mysql:

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

增加它。

在命令行上尝试。

无论你使用什么代码来运行sql都失败了,而不是sql语句本身。

UPDATE查询的LIMIT = 1是什么意思?

答案 2 :(得分:0)

我建议做的是设置PHP以回显它正在运行的查询,它返回的结果等,等等。你可以做的一切。查看SQL日志(如果适用)以查看在哪些表上运行的查询。基本上你需要确切地看到在哪里失败点。

当你声明SQL语句有时有效时,是基于从代码调用,还是通过mysql调用(假设你正在使用的)提示?如果它是先前的,您是否尝试在命令提示符下运行它以查看是否获得与代码相同的结果?如果没有,那么您可以排除数据库并开始专门查看您的代码。

祝你好运!

答案 3 :(得分:0)

我会看看你在何时何地进行BEGIN TRANSACTION / COMMIT处理。

可能是您没有检查SQL返回码并错过了“DEADLOCK”警告。