来自上一行的MySQL触发器

时间:2016-12-31 01:12:57

标签: mysql triggers

已经工作了好几个小时..我是如此接近。

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

结果如下:

enter image description here

当我想要的结果只是从前一行中减去它时,无法弄清楚为什么它会在sold上进行运行计数。

期望的输出:

enter image description here

我认为select quantity into prev_quantity是罪魁祸首,但我无法想出一个可行的替代方案。

编辑:这是一个sqlfiddle - http://sqlfiddle.com/#!9/6cd76/2/0

1 个答案:

答案 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,我建议不要这样做。