我只是在此查询中感到困惑,如果您对此有任何想法,我不知道如何解决,请帮助我或绝对感谢您的帮助
我有这样的表结构,测试列包含 3 个值
UPDATE `test` SET test = test -3
当我执行此查询时,结果将显示如下
UPDATE `test` SET test = test -4
但是当我执行这个查询时,结果不会像这样正确保存在测试列中
需要 0 个结果,或者我也不需要任何减值
显然您正在使用BIGINT UNSIGNED
数据类型。如果要存储负数,则需要将其更改为常规签名BIGINT
(也请务必将其设置为NULL
或NOT NULL
根据需要):
ALTER TABLE test
MODIFY COLUMN test BIGINT;
更新:如果你真的想在你的例子中存储 0 而不是 -4 ,你可以使用这样的GREATEST()
函数来做到这一点:
UPDATE `test` SET test = GREATEST(CAST(test AS SIGNED) - 4,0)
问题很可能是由于您的 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,否则执行减法。
根据这个问题: MySQL:bigint Vs int
bigint 的最大值是 18,446,744,073,709,551,615
当您从 0 中减去时,您将返回到最大值,因为您的 bigint 是无符号的。