我有一个典型的基于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();
我希望将摘要表更新为最新值始终。 像这样使用触发器和存储过程是最好的方法还是有一种优雅的方式来做到这一点?
答案 0 :(得分:2)
为什么不使用像这样的视图:
CREATE VIEW Summary AS
SELECT status, count(*)
FROM Base
GROUP BY status;
每次需要时,只需:
SELECT *
FROM Summary
您将实时获得结果(每次调用重新计算)。
可以像在Zend Framework中使用表一样使用视图。只需要按照here
的说明明确指定主键答案 1 :(得分:2)
您正在为您已经知道的数据一遍又一遍地重新查询数据库。
为什么不仅仅使用更改来更新摘要。
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 ;
这将更加快速,更加优雅。