【问题标题】:Trigger :Do not execute INSERT INTO when SELECT returns no result触发器:SELECT没有返回结果时不执行INSERT INTO
【发布时间】:2016-12-08 00:25:52
【问题描述】:


我在 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 ;

谢谢!

【问题讨论】:

    标签: mysql select triggers multiple-insert


    【解决方案1】:

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

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

    插入表格(...)
    选择期望值
    FROM必要的地方
    WHERE适用条件

    到这里:

    插入表格(...)
    选择期望值
    FROM必要的地方
    WHERE适用条件
    并且存在 (选择 *
    从酒吧
    哪里 AWK
    )

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

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

    【讨论】:

    • 感谢您的帮助!但是,我注意到在我的情况下肯定会得到 EXISTS 查询。触发条件将是每一个 INSERT ON table1。我怎么能把它变成一个 SELECT 查询?没听懂,抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2014-04-23
    • 1970-01-01
    • 2021-11-16
    相关资源
    最近更新 更多