0

在我的 MySQL 数据库上,我有一个无符号的 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”。问题是有时我想同时更新两列,如果我将所有列 > 0 放在 WHERE 子句中,它不会更新任何列。

谢谢你。

4

1 回答 1

1

这似乎有点......折磨人,所有这些强制转换和条件的东西(顺便说一句,每行函数很少在大表中很好地扩展)。

where如果它已经为零,为什么不直接修改子句以停止减量?

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无论如何它都会改变。而且它仍然远离导致许多查询的每行内容。

于 2012-04-07T02:00:35.817 回答