Mysql触发器有两个表

时间:2012-04-12 18:15:27

标签: mysql triggers

如果列receipt_on =季度兴趣,我正在创建更新列TEST的触发器 然后,如果是这样,它应该在列receipt_amount中找到总和并加入另一个表贷款 表l_app_file_id上​​的表来自表receipt_history的列r_app_file_id上​​的表Loan 表receipt_history中的receipt_date列中的月份名称应与当前月份相同,但我不确定如何完全构造此触发器

-- 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 个答案:

答案 0 :(得分: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子句中重复该条款。
触发器中的每个语句都需要由;终止。