更新字段值但是还应用上限?

时间:2012-03-02 02:52:21

标签: mysql

是否可以更新字段的值但同时限制它?:

UPDATE users SET num_apples=num_apples-1 WHERE xxx = ?

我不希望字段“num_apples”低于零。我可以在一次手术中做到吗?

由于

-----更新------------------

UPDATE users SET num_apples=num_apples-1 WHERE user_id = 123 AND num_apples > 0;

如果我只有“user_id”的索引,而不是“num_apples”,那么这对性能有害吗?我不确定mysql是如何实现这个操作的。我希望user_id部分的WHERE使它快速。我必须经常执行此操作。

由于

2 个答案:

答案 0 :(得分:2)

只需添加WHERE条件,仅指定行> 0,所以它不会将任何行更新为否定。

UPDATE users SET num_apples=num_apples-1 WHERE num_apples > 0;

更新

关于索引的子问题,一如既往,测试性能的方法是自己对其进行基准测试。检查查询的EXPLAIN并确保它使用user_id上的索引(应该是)。最后,在成为问题之前,不要过分担心这个简单操作的性能。您现在没有num_apples的索引,但如果性能无法满足您的需求,您是否可以添加一个索引?

答案 1 :(得分:1)

您不需要创建2个索引,因为只使用一个索引。您应该将两个字段都索引到一个索引中。索引应该是user_id和num_apples:

alter table t add index(user_id, num_apples) yourNewIndex;

您实际上可以删除以前的索引,因为它还包含它:

alter table t drop index yourOldIndex;

在删除之前,您可以通过运行获取有关正在使用的索引的信息:

EXPLAIN UPDATE users SET num_apples=num_apples-1
WHERE user_id = 123 AND num_apples > 0;

如果使用的索引是yourNewIndex,那么MySQL意识到使用它的速度比前一个快。

修改

  我甚至需要检查吗? mysql会阻止值进入<在这种情况下默认为0?

是的,你会的。如果您不控制更新,则在运行更新时会出现数据截断错误:

Data truncation: BIGINT UNSIGNED value is out of range