【问题标题】:Unsigned field updated to max value无符号字段更新为最大值
【发布时间】:2023-03-22 15:03:01
【问题描述】:

我在使这个简单的查询工作时遇到了问题:

INSERT INTO stock
( articles_id, date, in, out ) 
VALUES 
( 106,  '2017-08-24', 0, 4 ) 
ON DUPLICATE KEY UPDATE out = IF( out - 4 >= 0, out - 4, 0 )

这是股票表的结构:

CREATE TABLE IF NOT EXISTS `stock` (
  `articles_id` mediumint(8) unsigned NOT NULL,
  `date` date NOT NULL,
  `in` mediumint(8) unsigned NOT NULL COMMENT 'new units in date',
  `out` mediumint(8) unsigned NOT NULL COMMENT 'no. of units sold in date'
  PRIMARY KEY  (`articles_id`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

查询的记录已经存在,并且有这些值:

  1. articles_id: 106
  2. 日期:2017-08-24
  3. 在:0
  4. 出局:2

查询运行后,out的值为16777215,我猜是因为这个字段是unsigned的(我想要那样),如果我减去一个比原始值更大的值,它就会从最大值开始倒计时。

但是,我的 IF 语句不应该阻止这种行为吗?

【问题讨论】:

    标签: mysql sql unsigned


    【解决方案1】:

    你需要使用传入值,所以使用values()

    INSERT INTO stock( articles_id, date, in, out ) 
        VALUES ( 106,  '2017-08-24', 0, 4 ) 
        ON DUPLICATE KEY UPDATE out = (CASE WHEN VALUES(out) - 4 >= 0
                                            THEN VALUES(out) - 4
                                            ELSE 0
                                       END);
    

    【讨论】:

    • 所以我猜 (out - 4) 没有取它的值,但它在字段本身上运行,因此得到这个值: 16777215 ,因为它大于 0,它进入第一个条件并最终做减法。
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多