2016-12-31 3 views
1

Seit Stunden daran gearbeitet .. bin so nah dran.MySQL Auslöser aus der vorherigen Zeile

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 

Hier ist das Ergebnis:

enter image description here

Kann nicht herausfinden, warum es ein laufendes Tally auf sold tun, wenn mein gewünschtes Ergebnis ist es einfach von der vorherige Reihe subtrahiert wird.

gewünschte Ausgabe:

enter image description here

Ich denke select quantity into prev_quantity ist der Schuldige, aber ich kann nicht eine brauchbare Alternative aufbringen werden.

edit: hier ist eine sqlfiddle - http://sqlfiddle.com/#!9/6cd76/2/0

Antwort

2

Das Problem ist Ihre LIMIT immer in der Tabelle die erste Zeile zu lesen, weil die Standardreihenfolge nach dem Primärschlüssel ist, aufsteigend. So prev_quantity ist immer 100.

Um die letzten Menge zu erhalten, müssen Sie verwenden:

select quantity 
into prev_quantity 
from inventory_history 
order by id desc 
limit 1; 

Aber ich Sie warnen, dass dies zu einer Race-Bedingung anfällig ist. Zwei gleichzeitige Einfügungen in die Tabelle könnten den gleichen Wert wie die letzte Menge lesen, und dann ihren neuen verkauften Gesamt berechnen auf dieser Grundlage, und Sie würden die folgend erhalten:

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

Da beiden Einsätze lesen „50“ hat die letzte Menge vor der Berechnung von Verkauft.

die verkaufte Berechnung ist 50-40 = 10 für ID 15 und 50-30 = 20 für ID 16

Der einzige Weg, dagegen zu schützen ist, die Tabelle während einer INSERT zu verriegeln:

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

Ich empfehle das nicht, wenn Sie gleichzeitige INSERTs mit gutem Durchsatz unterstützen möchten.

+0

Vielen Dank und für die zusätzliche Vorsicht. Ich denke, dass ich es ein bisschen ändern muss, um an zusätzliche Spalten zu binden, um dies zu verhindern – bbruman

Verwandte Themen