无符号字段更新为最大值

Unsigned field updated to max value

我在执行这个简单的查询时遇到了问题:

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 )

这是股票的结构table:

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 声明不应该阻止这种行为吗??

您需要使用 incoming 值,因此请使用 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);