3

我只是在此查询中感到困惑,如果您对此有任何想法,我不知道如何解决,请帮助我或绝对感谢您的帮助

我有这样的表结构,测试列包含 3 个值

在此处输入图像描述

UPDATE `test` SET test = test -3

当我执行此查询时,结果将显示如下

在此处输入图像描述

UPDATE `test` SET test = test -4

但是当我执行这个查询时,结果不会像这样正确保存在测试列中

在此处输入图像描述

需要 0 个结果,或者我也不需要任何减值

4

3 回答 3

2

显然您正在使用BIGINT UNSIGNED数据类型。如果要存储负数,则需要将其更改为常规签名BIGINT(也请务必将其设置为NULLNOT NULL根据需要):

ALTER TABLE test
  MODIFY COLUMN test BIGINT;

更新:如果你真的想在你的例子中存储 0 而不是 -4 ,你可以使用这样的GREATEST()函数来做到这一点:

UPDATE `test` SET test = GREATEST(CAST(test AS SIGNED) - 4,0)
于 2012-04-19T16:53:40.857 回答
1

问题很可能是由于您的 bigint 未签名。

根据文档,未签名的 bigint 是

一个大整数。有符号范围是 -9223372036854775808 到 9223372036854775807。无符号范围是 0 到 18446744073709551615。

注意无符号范围以及它是你的数字 - 3(我相信 4 来自从 0 到 xxx15)

因此,您只需要将列更新为非无符号(已签名)的 bigint,这应该可以工作。

ALTER TABLE test MODIFY COLUMN test BIGINT SIGNED;

更新

如果你想保持 BIGINT UNSIGNED 以便你不能有负数,那么你可以编写一个触发器来强制一个 0,或者你可以让你的查询像这样:

UPDATE test
SET test = CASE WHEN test >= value THEN test-value ELSE 0 END 

基本上,如果尝试减去的值大于当前值,则只需将该值设置为 0,否则执行减法。

于 2012-04-19T16:49:06.207 回答
0

根据这个问题: MySQL:bigint Vs int

bigint 的最大值是 18,446,744,073,709,551,615

当您从 0 中减去时,您将返回到最大值,因为您的 bigint 是无符号的。

于 2012-04-19T16:46:31.160 回答