mysql仅在不重复时插入触发器

时间:2018-10-02 09:51:35

标签: mysql triggers

我有点不喜欢使用触发事件来获得预期的结果

这里的主表是fee。结构如下

费用

id  |   rn  |   fid |   amount  |   f_month |   year
====================================================
1   |   1   |   1   |   150000  |   1       |   1
2   |   1   |   2   |   50000   |   1       |   1
3   |   2   |   1   |   550500  |   2       |   1
4   |   2   |   2   |   200     |   2       |   1
5   |   3   |   1   |   550500  |   2       |   1

已使用简单插入触发器。

DROP TRIGGER IF EXISTS `insertinv`;
CREATE DEFINER=`root`@`localhost` TRIGGER `insertinv`
AFTER INSERT ON `fee` FOR EACH ROW INSERT INTO invoice VALUES(null, NEW.rn, NEW.year, '') 

我得到的输出

发票

inv |   rn  |   y_d |   status  
==============================
1   |   1   |   1   |   0
2   |   1   |   1   |   0
3   |   2   |   1   |   0
4   |   2   |   1   |   0
5   |   3   |   1   |   0

但是我想申请条件

如果fee.rnfee.f_monthfee.year相同,则停止插入。我的意思是忽略fee.fid

并获得以下结果。预期的

发票

inv |   rn  |   y_d |   status  
==============================
1   |   1   |   1   |   0
2   |   2   |   1   |   0
3   |   3   |   1   |   0

在触发器表inv中是主键和自动递增

1 个答案:

答案 0 :(得分:1)

  • 检查是否存在invyearrn匹配的内容。
  • 如果不存在,则使用insert语句。

执行以下操作:

DELIMITER $$
DROP TRIGGER IF EXISTS `insertinv` $$

CREATE DEFINER=`root`@`localhost` TRIGGER `insertinv`
AFTER INSERT ON `fee` 
FOR EACH ROW 
  BEGIN

    /* Declare a variable to store invoice id for matching year and rn */
    DECLARE inv_exists INT(11) DEFAULT 0;

    /* Fetch the invoice id if exists */
    SELECT inv INTO inv_exists 
    FROM invoice 
    WHERE rn = NEW.rn AND 
          y_d = NEW.year; 

    /* if no invoice exists then insert into the table */
    IF NOT(inv_exists > 0) THEN 

        /* Insert statement */
        INSERT INTO invoice VALUES(null, NEW.rn, NEW.year, '') ;

    END IF;
END $$
DELIMITER ;