【问题标题】:Query update issue查询更新问题
【发布时间】:2012-05-01 05:46:03
【问题描述】:

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

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

UPDATE `test` SET test = test -3

当我执行这个查询时,结果会像这样显示

UPDATE `test` SET test = test -4

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

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

【问题讨论】:

  • 请发布表定义。
  • 好吧 bigint 是为正整数制作的,所以低于 0 它又从最顶端开始
  • @Hajo 我该如何解决这个查询
  • @Hajo sqlfiddle.com/#!2/9802b/1 这个小提琴另有说明。这是我的想法,但想测试一下
  • @JustinPihony 有时这些事情取决于使用的 rdbms 的实现

标签: mysql sql


【解决方案1】:

显然您使用的是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)

【讨论】:

  • 感谢@Ike Walker 分享您的经验
【解决方案2】:

问题很可能是由于您的 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,否则执行减法。

【讨论】:

  • @JustinPihony 没有触发器是可能的
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2013-03-27
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多