考试首页 | 考试用书 | 培训课程 | 模拟考场 | 考试论坛  
  当前位置:编程开发 > MYSQL > 文章内容
  

Mysql教程:MySQL通过触发器解决数据库中表的行数限制详解及实例

 [ 2017年9月4日 ] 【

  MySQL通过触发器解决数据库中表的行数限制详解及实例

  最近项目一个需求是对操作日志的数量限制为10万条,超过十万条便删除最旧的那一条,保存数据库中日志数量不超过10万。

  当时我的第一想法是通过触发器来做,便在数据库中执行了如下的SQL:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
delimiter $
create trigger limitLog
before
insert
on OperationLog
for each row
begin
if (select count(*) from OperationLog) > 100000 then
delete from OperationLog limit 1;
end if;
end $
 
delimiter ;

  看起来似乎没什么问题,对于insert前执行判断,如果数量超过100000就执行删除。但在真正数据库超过100000条,也就是开始执行IF语句的时候就出问题,MySQL报错:

  ?

1
2
3
ERROR 1442 (HY000): Can't update table 'OperationLog' in stored
function/trigger because it is already used by statement which invoked
this stored function/trigger.

  查阅资料才知道,MySQL为了防止触发器递归死循环的执行,不允许在某张表的触发器中直接对该表进行DML(SELECT,DELETE,UPDATE,INSERT)操作,当然可以对其他表进行这样操作。

  触发器限制的是执行对该表的DML操作。触发器可以在你的执行前后来修改要执行的这一行数据,通过set关键字。

  ?

1
2
3
4
5
6
7
8
9
10
11
delimiter $
create trigger setLog
before
insert
on OperationLog
for each row
begin
set NEW.action = 'test';
end $
 
delimiter ;

  上述语句表示在insert OpetationLog表的之前,更新insert这条数据的action字段值为test,NEW就表示新添加的这条字段,同样的OLD就表示delete时的字段。而在update的时候NEW以及OLD同时都可以使用。

  临时触发器

  刚刚谈到的触发器(Triggers)是基于某个表所产生的事件触发的,而临时触发器也称为事件调度器是基于特定时间周期触发来执行某些任务。MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精 确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。

  在使用这个功能之前必须确保event_scheduler已开启,可执行

  ?

1
GLOBAL event_scheduler = 1;

  或者

  ?

1
SET GLOBAL event_scheduler = ON;

  要查看当前是否已开启事件调度器,可执行如下SQL:

  ?

1
SHOW VARIABLES LIKE 'event_scheduler';

  或

  ?

1
SELECT @@event_scheduler;

  或

  ?

1
SHOW PROCESSLIST;

  而对于本文一开始提到的问题,使用这种机制则可完美解决:

  ?

1
2
3
delimiter $
CREATE EVENT limitLog ON SCHEDULE EVERY 1 SECOND DO IF (select count(*) from OperationLog) > 100000 then delete from OperationLog limit 1;END IF $
 delimiter ;

  亲测有效

  感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 

本文纠错】【告诉好友】【打印此文】【返回顶部
将考试网添加到收藏夹 | 每次上网自动访问考试网 | 复制本页地址,传给QQ/MSN上的好友 | 申请链接 | 意见留言 TOP
关于本站  网站声明  广告服务  联系方式  站内导航  考试论坛
Copyright © 2007-2013 中华考试网(Examw.com) All Rights Reserved