我有一个典型的基于 LAMP 的站点 + Zend Framework,其中有一个基表和一个汇总表。汇总表用于在报表中显示数据。
基表-
ID | Status
1 | 1
2 | 1
3 | 2
4 | 2
5 | 1
6 | 1
汇总表-
Status | Count
1 | 4
2 | 2
基表将以平均每天 20 次的速度更改(插入、更新、删除)。
目前,我正在使用触发器调用一个存储过程,该过程将根据基表更新汇总表。
这是存储过程。
CREATE PROCEDURE UpdateSummary()
BEGIN
UPDATE summary a
INNER JOIN
(SELECT status, count(*) c from base group by status) b
ON a.status = b.status
SET a.count = b.c;
END
我有 3 个触发器(每个触发器一个 - 插入、删除和更新)。我在下面单独展示了插入样本。其他类似。
CREATE TRIGGER S_T_TRIGGER_I
AFTER INSERT ON base
FOR EACH ROW
CALL UpdateSummary();
我希望汇总表始终更新为最新值。 像这样使用触发器和存储过程是最好的方法还是有一种优雅的方法来做到这一点?
最佳答案
好吧,您正在一遍又一遍地重新查询数据库以获取您已知的数据。
为什么不只用更改来更新摘要。
DELIMITER $$
CREATE TRIGGER ai_base_each AFTER INSERT ON base FOR EACH ROW
BEGIN
INSERT INTO summary (status, count) VALUES (NEW.status,1)
ON DUPLICATE KEY UPDATE
SET count = count + 1;
END $$
CREATE TRIGGER ad_base_each AFTER DELETE ON base FOR EACH ROW
BEGIN
UPDATE summary s
SET s.count = s.count - 1
WHERE s.status = OLD.status;
END $$
CREATE TRIGGER au_base_each AFTER UPDATE ON base FOR EACH ROW
BEGIN
UPDATE summary s
SET s.count = s.count - 1
WHERE s.status = OLD.status;
INSERT INTO summary (status, count) VALUES (NEW.status,1)
ON DUPLICATE KEY UPDATE
SET count = count + 1;
END $$
DELIMITER ;
这会更快,更准确。
关于php - 基于触发器和存储过程更新汇总表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7570874/