2017-08-24 32 views
0

我有问题,使这个简单的查询工作:未签名的现场更新到最大值

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年8月2日4
  3. 在:0
  4. 出:2运行查询

后,具有的值,这是我想是因为此字段是无符号(我想这样),如果我减去比原来更大的值,它会从最大值开始倒数。

但是,应该不是我的如果语句阻止该行为?

回答

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); 
+1

所以我猜(出 - 4)不考虑它的价值,但它的经营的领域本身,从而得到这个值:16777215,因为它大于0,它进入第一个条件并最终进行减法。 – user3514092