首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于触发器和存储过程更新汇总表

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

Stack Overflow用户
提问于 2011-09-27 14:32:07
回答 2查看 1.9K关注 0票数 1

我有一个典型的基于LAMP的站点+,其中我有一个基表和一个汇总表。汇总表用于在报表中显示数据。

基表-

代码语言:javascript
复制
ID | Status
1 | 1
2 | 1
3 | 2
4 | 2
5 | 1
6 | 1

汇总表-

代码语言:javascript
复制
Status | Count
1 | 4
2 | 2

基表将被更改(插入、更新、删除),平均每天20次。

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

这是存储过程。

代码语言:javascript
复制
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个触发器(每个触发器-插入、删除和更新)。我仅在下面展示了插入示例。其他的也是类似的。

代码语言:javascript
复制
CREATE TRIGGER S_T_TRIGGER_I

AFTER INSERT ON base

FOR EACH ROW

CALL UpdateSummary();

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-27 14:40:05

你为什么不使用这样的视图:

代码语言:javascript
复制
 CREATE VIEW Summary AS 
      SELECT status, count(*)
      FROM Base
      GROUP BY status;

每次你需要的时候,只要做:

代码语言:javascript
复制
SELECT * 
FROM Summary 

你会得到你的结果在实时(每个调用重新计算)。

视图的使用方式与中使用表的方式相同。只需将主键显式地指定为解释的这里

票数 2
EN

Stack Overflow用户

发布于 2011-09-27 14:40:20

好吧,您正在一遍又一遍地查询DB,以获取您已经知道的数据。

为什么不只是用更改来更新摘要呢?

代码语言:javascript
复制
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 ;

这将是更快,更重要的一点,更优雅。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7570874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档