使用MySQL触发器自动生成日汇总表

为解决大量数据导致MySQL阻塞的问题,本文提出利用MySQL触发器自动生成日汇总表的解决方案。通过创建触发器,在数据写入时同步更新汇总表,确保高效统计。测试结果显示该方法有效。
摘要由CSDN通过智能技术生成

需求

每天有很多数据需要汇总,之前是用select sum(money)...来统计,当数据量上来时候往往会导致MySQL被阻塞。

解决方案

1、在程序中写入数据的时候同时往日报表里写(太简单了)
2、利用触发器

方法

CREATE TABLE `order` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `money` int(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `createAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

CREATE TRIGGER `report` AFTER INSERT ON `order` FOR EACH ROW
if not exists(select id from report_day where name=new.name and date=date(new.createAt)) then
  --先判断是否存在数据,没有则插入
  insert into report_day values(null,new.name,new.money,date(new.createAt));
else
  --存在则更新
  update report_day  set money=money+new.money where name=new.name and date=date(new.createAt);
end if;

CREATE TABLE `report_day` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `money` varchar(255) DEFAULT NULL,
  `date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM;

测试

insert into `order` (name,money,status) values('a',200,0);
insert into `order` (name,money,status) values('a',100,0);
insert into `order` (name,money,status) values('b',10,0);
insert into `order` (name,money,status) values('b',20,0);

结果

数据表:
数据表

汇总表:
汇总表

参考资料

[1] https://dev.mysql.com/doc/refman/5.5/en/create-trigger.html
[2] https://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值