2016-08-02 139 views
0


我在Mysql中使用触发器将新插入的行插入到多个表中。触发器由多个SELECT组成。我注意到只有当每个SELECT返回一个结果时,触发器才起作用。我明白,MySQL不喜欢插入任何东西......但是,最后记录的行通常不包含数据,以便为触发器的每个SELECT返回一个结果。在这种情况下,触发器无法运行。
例如,当我修改触发器只有返回的东西,然后所有的插入工作正常。
我想找到一种方法来告诉触发器不执行返回没有结果的SELECT的INSERT INTO。我怎么办?
触发器:SELECT不返回任何结果时不执行INSERT INTO

delimiter | 
CREATE TRIGGER trigger_name AFTER INSERT 
ON table1 
FOR EACH ROW 
BEGIN 
INSERT INTO table3 (field3a, field3b) 
    SELECT field1A, field1B 
    FROM table1 
    WHERE table1.id = table2.id 
    AND table1.id IN (SELECT max(id) FROM table1); 
INSERT INTO table4 (field4a, field4b) 
    SELECT field2A, field2B -- imagine this SELECT returns no row 
    FROM table2 
    WHERE table2.id = table1.id 
    AND table1.id IN (SELECT max(id) FROM table1); 
END; 
| 
delimiter ; 

谢谢!

回答

1

这很简单。在INSERT声明中,在你眼前,答案就在那里。你根本不需要大惊小怪。

增强INSERT语句以包含EXISTS条件。如果某个查询,SELECT FOO FROM BAR WHERE AWK是触发条件 - 如果它返回某些内容,则执行INSERT,但如果不是,则支持INSERT语句 - 然后从此扩展INSERT语句:

INSERT INTO TABLE(。)
        SELECT desiredValues
        FROM necessaryPlaces
        WHERE applicableConditions

这样:

INSERT INTO TABLE(。 。 。)
        SELECT desiredValues
        FROM necessaryPlaces
        WHERE applicableConditions
       与EXISTS        (SELECT *
               从BAR
                WHERE AWK
               )

如果未返回行,则EXISTS子句评估为FALSE,而“触发器”不是oc CUR。

请注意,我丢弃了SELECT FOO并将其替换为SELECT *;因为你感兴趣的是是否有任何行被检索到,所以没有理由做额外的工作来切断返回的行来产生该列和那一列:让查询优化器确定要做什么以及如何做它通过断言只是一般的SELECT *。

+0

感谢您的帮助!但是,我注意到我的情况下肯定会得到EXISTS查询。触发条件是每个INSERT ON table1。我怎么能把它变成一个SELECT查询?我不明白,对不起。 – RemiC