无符号字段已更新为最大值

时间:2017-08-24 10:56:37

标签: mysql sql unsigned

我在解决这个简单查询方面遇到了问题:

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. in:0
  4. out:2
  5. 运行查询后, out 的值为 16777215 ,我猜是因为此字段是 unsigned (我想要它)那样的话,如果我减去比原始值更大的值,它就从它的最大值开始向下计数。

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

1 个答案:

答案 0 :(得分:2)

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