2016-12-31 1 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 

が結果だ:それはsold上で実行されている集計をやっている理由

enter image description here

は私の望ましい結果がちょうど前の行からそれを差し引くとすると、把握することはできません。

所望の出力:私はselect quantity into prev_quantity考えている

enter image description here

は犯人ですが、私は実行可能な代替を召集することはできません。

編集:ここ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; 

は、しかし、私はあなたを警告します。持っている両方のインサートは「50」を読んでいるので

ID SKU Quantity Sold 
15 Filter 40  10 
16 Filter 30  20 

:テーブルには2つの同時挿入は、最後の数量と同じ値を読み、その後、それに基づいて彼らの新しい販売の合計を計算し、次のことを取得したいことができ売却額を計算する前の最後の数量。

販売計算はID 15 50-40 = 10であり、IDのため= 20 50から30 16

これに対して保護するための唯一の方法は、挿入時にテーブルをロックすることである。

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

スループットの良い並行INSERTをサポートしたい場合は、これをお勧めしません。

+0

どうもありがとうございました。これを防ぐために追加の列にバインドするには少し修正する必要があると思う – bbruman

関連する問題