是否可以更新字段的值但同时限制它?:
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使它快速。我必须经常执行此操作。
由于
答案 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