2012-04-12 44 views
0

我正在创建一个触发器来更新列TEST,如果列的receipt_on = Quarterly Interest Then如果是这样,它应该在列receipt_amount中找到总和,并从表Loan on column的列l_app_file_id上​​加入另一个表贷款 从表receipt_history r_app_file_id也从表receipt_history列receipt_date月份名称应该是一样的当月,但是我不知道是如何完全构建这个触发有两个表的Mysql触发器

-- Trigger DDL Statements 
DELIMITER $$ 

USE `lms`$$ 

CREATE 
DEFINER=`root`@`localhost` 
TRIGGER `lms`.`updateloan` 
BEFORE UPDATE ON `lms`.`receipt_history` 
FOR EACH ROW 
BEGIN 

if new.receipt_on='Quarterly Interest' then 
    SET new.TEST=SUM(receipt_amount) 
    join loan l on 
    l.l_app_file_id=r.r_app_file_id 
    WHERE r_app_file_id=l_app_file_id 
    and monthname(receipt_date)=MONTHNAME(now()) 
    end if;  

    END$$ 

回答

1

正如你现在知道你不能加入set声明。
您需要为此使用select语句。
这个结构将起作用set i:= (select sum(x) from a);
我个人比较喜欢SELECT something INTO avariable语法,但这只是一个口味问题。

DELIMITER $$ 

USE `lms`$$ 

CREATE 
DEFINER=`root`@`localhost` 
TRIGGER `lms`.`updateloan` 
BEFORE UPDATE ON `lms`.`receipt_history` 
FOR EACH ROW 
BEGIN 
    DECLARE itest integer; 

    if new.receipt_on='Quarterly Interest' then 
    SELECT SUM(r.receipt_amount) INTO itest FROM receipt_history r 
    INNER JOIN loan l ON (l.l_app_file_id=r.r_app_file_id) 
    WHERE monthname(r.receipt_date)=MONTHNAME(now()); 
    SET new.test = itest; 
    end if;  

    END$$ 

需要注意的是:
的加入标准已经是一个(种)where条款,这样你就不必再重复了where子句。
触发器中的每个语句都需要以;终止。

+0

非常感谢 – dames 2012-04-12 19:52:45