【问题标题】:mysql insert trigger only if not duplicate只有不重复的mysql插入触发器
【发布时间】:2019-03-07 10:32:43
【问题描述】:

我对使用触发事件来获得预期结果有点困惑

这里的主表是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.rn AND fee.f_month AND fee.year 相同,则停止插入。我的意思是忽略fee.fid

并获得以下结果。预期的

发票

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

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

【问题讨论】:

  • 你的触发器语法看起来不对。你只给出了伪代码吗?
  • @MadhurBhaiya,我已经编辑过了,这就是你的意思,不是吗?
  • 不,在问题中写你完整的触发器语句。您当前的触发器是否在做某事?
  • @MadhurBhaiya,当前的触发器正在工作,我已经发布了结果 - 第一个 invoice table,但是我期望最后一个 invoice table
  • @AnandHmt 请检查答案。由于发票表中没有月份,我不能考虑。

标签: mysql triggers


【解决方案1】:
  • 检查匹配的yearrn 是否存在inv
  • 如果不存在,则使用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 ;

【讨论】:

  • 您的回答不仅解决了我的问题,还意识到我的结构是错误的,我发现我的表结构必须修改。巨大的 !!!也尊重你的指导方针。请编辑答案semicolon 中的拼写错误在END IF 之前丢失。再次感谢。
  • @AnandHmt 乐于助人:)
猜你喜欢
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
相关资源
最近更新 更多