已经工作了好几个小时..我是如此接近。
CREATE TRIGGER `sold_diff` BEFORE INSERT ON `inventory_history`
FOR EACH ROW begin
declare prev_quantity int(11) default 0;
select quantity
into prev_quantity
from inventory_history
limit 1;
set NEW.sold = prev_quantity - NEW.quantity;
end
结果如下:
当我想要的结果只是从前一行中减去它时,无法弄清楚为什么它会在sold
上进行运行计数。
期望的输出:
我认为select quantity into prev_quantity
是罪魁祸首,但我无法想出一个可行的替代方案。
编辑:这是一个sqlfiddle - http://sqlfiddle.com/#!9/6cd76/2/0
答案 0 :(得分:2)
问题是你的LIMIT
总是读取表格中的第一行,因为默认顺序是主键,升序。所以prev_quantity总是100。
要获取 last 数量,您需要使用:
select quantity
into prev_quantity
from inventory_history
order by id desc
limit 1;
但是,我提醒你,这很容易受到竞争条件的影响。对表格的两个并发插入可以读取与最后一个数量相同的值,然后根据它计算新的销售总额,并且您获得以下内容:
ID SKU Quantity Sold
15 Filter 40 10
16 Filter 30 20
因为两个插入读取" 50"在计算售出之前有最后的数量。
ID 15的售出计算为50-40 = 10,ID 16为50-30 = 20。
防止这种情况的唯一方法是在INSERT期间锁定表:
LOCK TABLE inventory_history WRITE;
INSERT INTO inventory_history VALUES (...);
UNLOCK TABLES;
如果您想支持具有良好吞吐量的并发INSERT,我建议不要这样做。