2011-09-27 43 views
1

我有一个典型的基于LAMP的站点+ Zend框架,其中有一个基表和一个汇总表。汇总表用于显示报告中的数据。基于触发器和存储过程更新汇总表

基地台 - 在平均每天20次

Status | Count 
1 | 4 
2 | 2 

基表将被改变(插入,更新,删除) -

ID | Status 
1 | 1 
2 | 1 
3 | 2 
4 | 2 
5 | 1 
6 | 1 

汇总表。

目前,我正在使用触发器调用存储过程,该存储过程将根据基表更新汇总表。

这是存储过程。

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(); 

我想汇总表进行更新到最新值总是。 像这样使用触发器和存储过程是最好的方法还是有一个优雅的方式来做到这一点?

回答

2

你为什么不使用像一个观点:

CREATE VIEW Summary AS 
     SELECT status, count(*) 
     FROM Base 
     GROUP BY status; 

每次你都需要时间,只是做:

SELECT * 
FROM Summary 

,你会得到您的实时结果(每个呼叫重新-computed)。

视图可以像Zend Framework中使用的表一样使用。只要你需要明确地指定一个主键就像解释here

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 ; 

这将更加快速和更多的优点。