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