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

Mysql入门MySQL通过触发器解决数据库中表的行数限制详解及实例,第1张

概述介绍《Mysql入门MySQL通过触发器解决数据库中表的行数限制详解及实例》开发教程,希望对您有用。

《MysqL入门MysqL通过触发器解决数据库中表的行数限制详解及实例》要点:
本文介绍了MysqL入门MysqL通过触发器解决数据库中表的行数限制详解及实例,希望对您有用。如果有疑问,可以联系我们。

MysqL通过触发器办理数据库中表的行数限制详解及实例MysqL教程

最近项目一个需求是对 *** 作日志的数量限制为10万条,超过十万条便删除最旧的那一条,保存数据库中日志数量不超过10万.
当时我的第一想法是通过触发器来做,便在数据库中执行了如下的sql:MysqL教程

delimiter $create trigger limitLogbeforeinserton OperationLogfor each rowbeginif (select count(*) from OperationLog) > 100000 thendelete from OperationLog limit 1;end if;end $delimiter ;

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

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) *** 作,当然可以对其他表进行这样 *** 作.
MysqL教程

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

delimiter $create trigger setLogbeforeinserton OperationLogfor each rowbeginset NEW.action = 'test';end $delimiter ;

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

临时触发器
MysqL教程

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

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

 GLOBAL event_scheduler = 1;

或者MysqL教程

SET GLOBAL event_scheduler = ON;

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

SHOW VARIABLES liKE 'event_scheduler';

MysqL教程

SELECT @@event_scheduler;


MysqL教程

SHOW PROCESSList;

而对于本文一开始提到的问题,使用这种机制则可完美办理:MysqL教程

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 ;

亲测有效MysqL教程

感谢阅读,希望能赞助到大家,谢谢大家对本站的支持!MysqL教程

欢迎参与《MysqL入门MysqL通过触发器解决数据库中表的行数限制详解及实例》讨论,分享您的想法,内存溢出PHP学院为您提供专业教程。

总结

以上是内存溢出为你收集整理的Mysql入门MySQL通过触发器解决数据库中表的行数限制详解及实例全部内容,希望文章能够帮你解决Mysql入门MySQL通过触发器解决数据库中表的行数限制详解及实例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1157045.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存