php - 基于触发器和存储过程更新汇总表

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

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

最佳答案

好吧,您正在一遍又一遍地重新查询数据库以获取您已知的数据。

为什么不只用更改来更新摘要。

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/

相关文章:

javascript - 全局 PHP 头文件中的 JQuery

php - 使用 MYSQL 列出最新评论/事件的类别

java - mysql - 选择查询输出文件 - 文件保存在哪里

java - 在 Java 中使用从一个类到另一个类的列表中的查询结果

mysql - SQL 不匹配字符串

zend-framework - 教义 2 - 持续错误 - 给出警告 : spl_object_hash() expects parameter 1 to be object, null

php - TCPDF - 如何使打印速度更快?非常非常慢,1320条记录花了40分钟

php - mySQL中如何转义字符串

email - 将 Zend_Mime_Message 设置为 Zend_Mail 正文

php - 日期时间,+1 周和 -1 周工作方式不同