Mysql'语句级别'触发...你可以用两个技巧来做

时间:2017-06-01 01:18:30

标签: mysql triggers

我多次搜索以找到任何技巧或解决办法来在MySQL中创建一个“语句级”触发器,就像甲骨文一样,但我没有找到。所以我想出了这个技巧,它对我有用,希望它可以帮助任何人

请参阅下面的答案。

1 个答案:

答案 0 :(得分:0)

让我们说我们想插入多行,我们想要做一次但我们无法避免在MySQL触发器中“FOR EACH ROW”

`insert to table1 (sname,age) VALUES ('mariam',5),('jojo',3),('ahmed',29)`
  • 首先创建一个包含两列(statementidstableID
  • 的表statementid
  • 其次,你必须使用软件为你的陈述准备一个uniqe ID

  • 让我们说'123456'。

    将您的陈述更改为

    INSERT INTO table1 (sname,age,uniqueid) VALUES ('mariam',5,123456),('jojo',3,123456),('ahmed',29,123456)

        CREATE TRIGGER
        table1_after_insert
        AFTER INSERT
        ON
        table1
        FOR EACH ROW
        BEGIN
             DECLARE isfired tinyint(1);
             SELECT COUNT(statementid) INTO isfired from statementidstable where statementid=NEW.uniqeid LIMIT 1;
             IF isfired = 0 THEN
                 '''DO WHAT YOU WANT HERE because this is the first time for this statement id
                 '''then insert the statementid to statementidstable
                 INSERT INTO statementidstable (statementid) VALUES (NEW.uniqeid)
             ELSE
                 '''Nothing will happen becaue you already have the statement id in statementidstable 
             END IF;
         END;
    

    然后在完成后从statementidstable删除statementid(使用您的软件处理)

**你可以做到的另一个技巧,不需要状态,你的触发器只能在插入第一行后插入一次,或者在插入最后一行后插入或触发两次

  • 在这个技巧中你必须像这样准备你的陈述

      `insert to table1 (sname,age,rowid) VALUES ('mariam',5,1),('jojo',3,0),('dodo',3,0),('ahmed',29,-1)`
    

第一行有rowid = 1(不像任何其他行)使你的触发器知道它会在插入第一行后触发一次。

最后一行有rowid = -1(不像任何其他行)让你的触发器知道它会在插入最后一行后触发一次。

其他行的rowid = 0或任何其他值不在(1,-1)

        CREATE TRIGGER
        table1_after_insert
        AFTER INSERT
        ON
        table1
        FOR EACH ROW
        BEGIN
             IF rowid = 1 THEN
                 '''DO WHAT YOU WANT HERE after inserting first row only
             ELSEIF rowid = -1
                 '''DO WHAT YOU WANT HERE after inserting last row only
             ELSE
                 '''NOTHING WILL HAPPEN
             END IF;
         END;
  • 每个技巧都有它自己的好处......并注意第一个技巧可以处理'insert statement'和'update statement'
  • 我还在处理'删除声明'