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

需求

每天有很多数据需要汇总,之前是用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);

结果

数据表:
使用MySQL触发器自动生成日汇总表_第1张图片

汇总表:
使用MySQL触发器自动生成日汇总表_第2张图片

参考资料

[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

你可能感兴趣的:(SQL)