0


我在 Mysql 中使用了一个触发器,它将新插入的行插入到多个表中。触发器由几个 SELECT 组成。我注意到触发器仅在每个 SELECT 返回结果时才起作用。我知道 MySQL 不喜欢什么都不插入……但是,通常,最后记录的行不包含为触发器的每个 SELECT 返回结果的数据。在这种情况下,触发器无法运行。
例如,当我只使用返回某些内容的 SELECT 修改触发器时,所有 INSERT 都可以正常工作。
我想找到一种方法来告诉触发器不执行不返回结果的 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 ;

谢谢!

4

1 回答 1

1

这就像馅饼一样容易。答案就在您眼前,在 INSERT 语句中。您根本不需要对触发器大惊小怪。

增强 INSERT 语句以包含 EXISTS 条件。如果某个查询 SELECT FOO FROM BAR WHERE AWK 是触发条件 - 如果它返回某些内容,则执行 INSERT,但如果它没有返回则为 INSERT 支付费用 - 然后只需扩展您的 INSERT 语句:

INSERT INTO TABLE( . . . )
    SELECT desiredValues
    FROM requiredPlaces
    WHERE 适用条件

对此:

INSERT INTO TABLE( . . . )
    SELECT desiredValues
    FROM requiredPlaces
    WHERE applicableConditions
    AND EXISTS (SELECT *
        FROM BAR
        WHERE AWK
        )

如果没有返回任何行,则 EXISTS 子句的计算结果为 FALSE,并且“触发器”不会发生。

请注意,我删除了 SELECT FOO 并将其替换为 SELECT *; 由于您只关心是否检索到任何行,因此没有理由做额外的工作来分割返回的行以仅产生这一列和那一列:让查询优化器确定要做什么以及如何做它,通过断言非常一般的 SELECT *。

于 2016-08-02T15:11:52.030 回答