我有一个典型的基于LAMP的站点+,其中我有一个基表和一个汇总表。汇总表用于在报表中显示数据。
基表-
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();我希望将汇总表更新为最新值 the 。像这样使用触发器和存储过程是最好的方法,还是有一种优雅的方法来做到这一点?
发布于 2011-09-27 14:40:05
你为什么不使用这样的视图:
CREATE VIEW Summary AS
SELECT status, count(*)
FROM Base
GROUP BY status;每次你需要的时候,只要做:
SELECT *
FROM Summary 你会得到你的结果在实时(每个调用重新计算)。
视图的使用方式与中使用表的方式相同。只需将主键显式地指定为解释的这里
发布于 2011-09-27 14:40:20
好吧,您正在一遍又一遍地查询DB,以获取您已经知道的数据。
为什么不只是用更改来更新摘要呢?
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 ;这将是更快,更重要的一点,更优雅。
https://stackoverflow.com/questions/7570874
复制相似问题