在我的MySQL数据库中,我有一个unsigned mediumint列,我不断递增和递减它的值。
但是,我想确保当它的值为0时它不会减少。如果我这样做,UPDATE将使值取最大值mediumint,16777215。
所以,我在递减时有这个查询:
UPDATE `counters` SET `received`=IF(CAST(`received`-1 AS SIGNED)>0, `received`-1, 0) WHERE `id`="1234"
这是我只使用一个查询的唯一技巧。
它在MySQL 5.1上运行得很好,但是,昨天我升级到了MySQL 5.5,现在我收到了这些错误:
BIGINT UNSIGNED value is out of range in '(`db_main`.`counters`.`received` - 1)'
有什么方法可以解决这个问题吗? 或者......有没有其他方法可以确保在一个查询中,当将1减去0时它不会取“16777215”的值?
编辑 - 我可以使用WHERE,添加“AND received> 0”。问题是有时候我想同时更新两列,如果我把所有列都放在>在WHERE子句中,它不会更新任何列。
谢谢。
答案 0 :(得分:1)
这似乎有点......折磨,所有的投射和有条件的东西(顺便说一句,每行功能很少在大表中扩展)。
为什么不修改where
子句以停止decrment(如果它已经为零)?
update counters set received = received - 1
where id = '1234' and received > 0
如果您想要更新其他列,而不管received
的值是什么,您可以通过交易执行此操作:
begin transaction
update counters set received = received - 1 where id = '1234' and received > 0
update counters set xyzzy = 'plugh' where id = '1234'
commit transaction
这会减少received
,但不会低于零,无论如何都会改变xyzzy
。而且它仍然远离导致许多查询的每行内容。