3
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$$

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

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$$
4

3 回答 3

2

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

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

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
于 2012-08-19T09:18:36.123 回答
1

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

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

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

于 2012-08-19T09:11:56.187 回答
0

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

INSERT INTO customer SELECT * FROM customer_old;

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

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

于 2012-08-19T09:30:40.743 回答