2013-11-21 1 views
3

У меня есть триггер после вставки, который должен обновлять поля в другой таблице на основе недавно вставленной строки. (Вычитание суммы акций в одном месте и добавление в другое место). Каждый столбец является местоположением хранения диктата.UPDATE с заданным полем условно не работает?

Точное поле для обновления определяется из выбранного состояния. По существу

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

ГДЕ FIELD1 и FIELD2 определяются сазе

спускового крючка у меня выглядит, как это сейчас:

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 для правильного синтаксиса использовать вблизи «( СЛУЧАЙ ПРИ fromstocklocationvar = 1 THEN sl1 КОГДА fromstocklocationvar = 2 THEN 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 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

Смежные вопросы