2012-04-12 61 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