在某些情况下,为什么减去unsigned int列的值的查询失败?

时间:2018-07-16 14:01:17

标签: mysql sql

我有一个包含2列idmyvalue的表。 id是主键,myvalueunsigned smallintmyvalue 1当前的id为0。我有以下sql查询:

UPDATE tablename SET myvalue = IF(myvalue - 1 > 0, myvalue - 1, 0) WHERE id = 1;

我收到以下错误:

ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(`dbname`.`tablename`.`myvalue` - 1)'

知道为什么会这样吗?我找不到与此有关的任何在线资源。

如果我更改表以从myvalue列中删除未签名,则相同的查询有效。

2 个答案:

答案 0 :(得分:2)

如果myvalue为0,则myvalue-1将为负,您不能将其放入无符号整数(否则它将是无符号整数的最大值)。

这是相同的检查,但不使用myvalue-1。

UPDATE tablename SET myvalue = IF(myvalue > 1, myvalue - 1, 0) WHERE id = 1;

答案 1 :(得分:0)

我将在where子句中进行过滤:

update t
    set myvalue = myvalue - 1
    where myvalue > 0 and id = 1;