像MySQL这样的东西会触发但是作为一个整体?

时间:2012-08-19 09:05:18

标签: mysql sql triggers

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

3 个答案:

答案 0 :(得分:2)

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

e.g。 (语法测试,但总体思路成立)

UPDATE

答案 1 :(得分:1)

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

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

请您提供全面的情况说明,也许我可以帮助您找到更好的解决方案......: - )

答案 2 :(得分:0)

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

INSERT INTO customer SELECT * FROM customer_old;

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

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