【问题标题】:Something like MySQL triggers but as a whole?像 MySQL 触发器一样的东西,但作为一个整体?
【发布时间】:2012-08-19 09:05:17
【问题描述】:
CREATE TRIGGER `after_customer_insert`
AFTER INSERT ON `customer`
FOR EACH ROW BEGIN
    UPDATE `user`
    SET
        `customers_count` = `customers_count` + 1
    WHERE `id` = NEW.`user_id`;
END$$

不是为customer 中的每个新行调用UPDATE user,而是可以将触发器作为一个“整体”?我的意思是像

CREATE TRIGGER `after_customer_insert`
AFTER INSERT ON `customer`
BEGIN
    UPDATE `user`
    SET
        `customers_count` = (
            SELECT COUNT(`id`)
            FROM `customer`
            WHERE `user_id` = `id`
        )
END$$

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    触发器主要用于执行与单行行更改相关的操作,通常是更改另一行,正如 Jake 指出的那样。当然,您可以实现(冗余地)对更新的每一行的大致相同结果集执行相同操作的逻辑,但问题是,为什么您不在原始UPDATE 之后发出单个UPDATE 语句?你可能有一个很好的理由,因此 Jake 关于整体情况的问题。

    例如(语法测试,但总体思路成立)

    UPDATE u set u.customer_count = x.newcount
    from
    user u inner join 
    (
    select user, count(*) as newcount
    from user group by customer_id
    ) x
    

    【讨论】:

    • 那么您可以简单地将两个更新包装在参数化过程中。
    【解决方案2】:

    嗯,它会起作用,因为我自己做过一次。每次发生新的插入时,我都会在桌子上订购一些东西,但在我看来,这不是一个好习惯。您的代码可能有一些改进,可以省去这个麻烦。

    此外,即使此触发器将处理表上的所有行,它也会在每次 INSERT 发生时被调用...

    能否请您提供一个总体情况描述,也许我可以帮助您找到更好的解决方案... :-)

    【讨论】:

    • 情况就这么简单:更新给定用户拥有的客户数量:)
    • 嗯,这很简单,但是,再一次,这不是好的做法。您正在存储不必要的数据。考虑到您不需要在检索时计算任何内容,它可以提高性能,但是您需要在每次插入时更新它,所以......我不确定它是否值得,实际上我确定它不是,你应该实现一个在你的代码或查询上“计数”,也许你甚至不需要这个计数......
    • 我确定您经常从这些表中检索一些信息,而且您并不总是需要知道这个计数,因此您使用触发器创建的这个性能问题可能不是很好,具体取决于您的负载等...
    【解决方案3】:

    可能需要这种类型的触发器的唯一情况是用于查询:

    INSERT INTO customer SELECT * FROM customer_old;
    

    但是对于这种情况,您可以在查询之前禁用触发器,执行插入更新并重新启用触发器。

    我非常怀疑您是否经常一次插入多个客户。或者即使这是真的,你也试图过早地进行优化。

    【讨论】:

      猜你喜欢
      • 2014-07-09
      • 2015-02-04
      • 2021-10-21
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      相关资源
      最近更新 更多