2016-12-31 33 views
1

這方面的工作了幾個小時..我這麼近。MySQL的觸發從上一行

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

回答

2

的問題是你的LIMIT總是讀表的第一行,因爲默認的順序是由主鍵,上升。所以prev_quantity始終是100

要獲得最後數量,你需要使用:

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」有計算出售之前的最後一個數量。

的已售出的計算是50-40 = 10 ID 15,和50-30 = 20,用於ID 16.

,以防止這種情況的唯一途徑是插入期間鎖定該表:

LOCK TABLE inventory_history WRITE; 
INSERT INTO inventory_history VALUES (...); 
UNLOCK TABLES; 

我不建議這樣做,如果你想支持與良好的吞吐量併發插入。

+0

非常感謝您,併爲更多的謹慎。思考我需要稍微修改它以綁定到其他列以防止出現這種情況 – bbruman