UPDATE上的“BIGINT UNSIGNED值超出范围”?

时间:2012-04-07 01:56:51

标签: mysql

在我的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子句中,它不会更新任何列。

谢谢。

1 个答案:

答案 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。而且它仍然远离导致许多查询的每行内容。