根据触发器和存储过程更新摘要表

时间:2011-09-27 14:32:08

标签: php mysql zend-framework stored-procedures triggers

我有一个典型的基于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();

我希望将摘要表更新为最新值始终。 像这样使用触发器和存储过程是最好的方法还是有一种优雅的方式来做到这一点?

2 个答案:

答案 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 ;

这将更加快速,更加优雅。