2013-11-21 25 views
3

我有一個表上的後插入觸發器,以便根據新插入的行更新另一個表上的字段。 (它在一個位置扣除庫存數量並添加到另一個位置,每一列都是一個區分庫存位置)更新與設置字段確定有條件不工作?

要更新的確切字段由選擇的統計數據確定。從本質上講

UPDATE stock SET FIELD1=FIELD1+NEW.stquantity, FIELD2=FIELD2-NEW.stquantity 

WHERE FIELD1和FIELD2由case語句

觸發我決定現在看起來是這樣的:

CREATE TRIGGER `changestockqty` AFTER INSERT ON `stocktransfer_items` FOR EACH ROW 

BEGIN 
DECLARE fromstocklocationvar INT DEFAULT -1; 
DECLARE tostocklocationvar INT DEFAULT -1; 


SET fromstocklocationvar = (SELECT stsource_location FROM stocktransfers WHERE stocktransfer.idstocktransfers=NEW.idstocktransfers); 
SET tostocklocationvar = (SELECT stdest_location FROM stocktransfers WHERE stocktransfer.idstocktransfers=NEW.idstocktransfers); 

UPDATE stock SET 
CASE 
WHEN fromstocklocationvar=1 THEN sl1 
WHEN fromstocklocationvar=2 THEN sl2 
WHEN fromstocklocationvar=3 THEN sl3 
WHEN fromstocklocationvar=4 THEN sl4 
WHEN fromstocklocationvar=5 THEN sl5 
END 
= 
CASE  
WHEN fromstocklocationvar=1 THEN sl1 
WHEN fromstocklocationvar=2 THEN sl2 
WHEN fromstocklocationvar=3 THEN sl3 
WHEN fromstocklocationvar=4 THEN sl4 
WHEN fromstocklocationvar=5 THEN sl5 
END 
-NEW.stquantity, 
CASE 
WHEN tostocklocationvar=1 THEN sl1 
WHEN tostocklocationvar=2 THEN sl2 
WHEN tostocklocationvar=3 THEN sl3 
WHEN tostocklocationvar=4 THEN sl4 
WHEN tostocklocationvar=5 THEN sl5 
END 
= 
CASE  
WHEN tostocklocationvar=1 THEN sl1 
WHEN tostocklocationvar=2 THEN sl2 
WHEN tostocklocationvar=3 THEN sl3 
WHEN tostocklocationvar=4 THEN sl4 
WHEN tostocklocationvar=5 THEN sl5 
END 
+NEW.stquantity, 

WHERE stock.idstockpcode=NEW.stpcode; 

END 

它顯示了第一例後一個錯誤。我究竟做錯了什麼?

+0

什麼錯誤? –

+0

它說錯誤:錯誤1064:您的SQL語法中有錯誤;檢查對應於你的MySQL服務器版本正確的語法使用附近的手冊「( CASE WHEN fromstocklocationvar = 1,則SL1 WHEN fromstocklocationvar = 2,則SL2」在第11 – Ali

+0

我使用的是MySQL 5.6.13 – Ali

回答

1

有可能是一個語法錯誤(您嘗試使用CASE語句來創建另一個說法)..

試試這個SQL(做同樣的事情):

CREATE TRIGGER `changestockqty` AFTER INSERT ON `stocktransfer_items` FOR EACH ROW 

BEGIN 
DECLARE fromstocklocationvar INT DEFAULT -1; 
DECLARE tostocklocationvar INT DEFAULT -1; 


SET fromstocklocationvar = (SELECT stsource_location FROM stocktransfers WHERE stocktransfer.idstocktransfers=NEW.idstocktransfers); 
SET tostocklocationvar = (SELECT stdest_location FROM stocktransfers WHERE stocktransfer.idstocktransfers=NEW.idstocktransfers); 

UPDATE stock SET 
sl1 = CASE WHEN fromstocklocationvar=1 THEN sl1-NEW.stquantity ELSE sl1 END, 
sl2 = CASE WHEN fromstocklocationvar=2 THEN sl2-NEW.stquantity ELSE sl2 END, 
sl3 = CASE WHEN fromstocklocationvar=3 THEN sl3-NEW.stquantity ELSE sl3 END, 
sl4 = CASE WHEN fromstocklocationvar=4 THEN sl4-NEW.stquantity ELSE sl4 END, 
sl5 = CASE WHEN fromstocklocationvar=5 THEN sl5-NEW.stquantity ELSE sl5 END 
, 
sl1 = CASE WHEN tostocklocationvar=1 THEN sl1+NEW.stquantity ELSE sl1 END, 
sl2 = CASE WHEN tostocklocationvar=2 THEN sl2+NEW.stquantity ELSE sl2 END, 
sl3 = CASE WHEN tostocklocationvar=3 THEN sl3+NEW.stquantity ELSE sl3 END, 
sl4 = CASE WHEN tostocklocationvar=4 THEN sl4+NEW.stquantity ELSE sl4 END, 
sl5 = CASE WHEN tostocklocationvar=5 THEN sl5+NEW.stquantity ELSE sl5 END 

WHERE stock.idstockpcode=NEW.stpcode; 

END 
+0

我得到了同樣的錯誤錯誤:錯誤1064:你的SQL語法有錯誤;查看與你的MySQL服務器版本相對應的手冊,在正確的語法附近使用'CASE WHEN fromstocklocationvar = 1 THEN sl1 = sl1 -NEW.stquantity WHEN fromstocklocat'at line 12 – Ali

+0

@Ali我更新了我的答案,現在就試試吧,希望這會有所幫助 – Kleskowy

1

你不能這樣做就這樣。 Update的左側必須修復。 這裏是一個例子:

UPDATE stock SET 
sl1=sl1 - CASE WHEN fromstocklocationvar=1 THEN NEW.stquantity ELSE 0 END 
     + CASE WHEN tostocklocationvar=1 THEN NEW.stquantity ELSE 0 END, 
sl2=sl2 - CASE WHEN fromstocklocationvar=2 THEN NEW.stquantity ELSE 0 END 
     + CASE WHEN tostocklocationvar=2 THEN NEW.stquantity ELSE 0 END, 
sl3=sl3 - CASE WHEN fromstocklocationvar=3 THEN NEW.stquantity ELSE 0 END 
     + CASE WHEN tostocklocationvar=3 THEN NEW.stquantity ELSE 0 END, 
sl4=sl4 - CASE WHEN fromstocklocationvar=4 THEN NEW.stquantity ELSE 0 END 
     + CASE WHEN tostocklocationvar=4 THEN NEW.stquantity ELSE 0 END, 
sl5=sl5 - CASE WHEN fromstocklocationvar=5 THEN NEW.stquantity ELSE 0 END 
     + CASE WHEN tostocklocationvar=5 THEN NEW.stquantity ELSE 0 END 

WHERE stock.idstockpcode=NEW.stpcode; 
+0

謝謝你解釋爲什麼它是不工作(更新的左側必須修復)。 – Ali