时间:2021-05-23
MySQL通过触发器解决数据库中表的行数限制详解及实例
最近项目一个需求是对操作日志的数量限制为10万条,超过十万条便删除最旧的那一条,保存数据库中日志数量不超过10万。
当时我的第一想法是通过触发器来做,便在数据库中执行了如下的SQL:
看起来似乎没什么问题,对于insert前执行判断,如果数量超过100000就执行删除。但在真正数据库超过100000条,也就是开始执行IF语句的时候就出问题,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)操作,当然可以对其他表进行这样操作。
触发器限制的是执行对该表的DML操作。触发器可以在你的执行前后来修改要执行的这一行数据,通过set关键字。
delimiter $create trigger setLogbeforeinserton OperationLogfor each rowbeginset NEW.action = 'test';end $delimiter ;上述语句表示在insert OpetationLog表的之前,更新insert这条数据的action字段值为test,NEW就表示新添加的这条字段,同样的OLD就表示delete时的字段。而在update的时候NEW以及OLD同时都可以使用。
临时触发器
刚刚谈到的触发器(Triggers)是基于某个表所产生的事件触发的,而临时触发器也称为事件调度器是基于特定时间周期触发来执行某些任务。MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作系统的计划任务(如:Linux下的CRON或Windows下的任务计划)只能精 确到每分钟执行一次。对于一些对数据实时性要求比较高的应用(例如:股票、赔率、比分等)就非常适合。
在使用这个功能之前必须确保event_scheduler已开启,可执行
GLOBAL event_scheduler = 1;或者
SET GLOBAL event_scheduler = ON;要查看当前是否已开启事件调度器,可执行如下SQL:
SHOW VARIABLES LIKE 'event_scheduler';或
SELECT @@event_scheduler;或
而对于本文一开始提到的问题,使用这种机制则可完美解决:
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 ;亲测有效
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了mysql触发器简介、创建触发器及使用限制。分享给大家供大家参考,具体如下:简介SQL触发器是存储在数据库目录中的一组SQL语句。每当与表相关联的
总结常用基本点如下:1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器)。 DDL触发器:在用户对数据库执行数据定义(
1.为什么使用触发器:在MySQL数据库中,数据库对象表是存储和操作数据的逻辑结构,而数据库对象触发器则用来实现由一些表事件触发的某个操作。在数据库系统中,当执
MySQL数据库可以通过触发器,使之无法修改某些字段的数据,同时又不会影响修改其他字段。DROPTRIGGERIFEXISTS`members`;SET@OLD
触发器相关概念及语法概述本篇博文中主要探讨以下内容:什么是触发器触发器的应用场景触发器的语法触发器的类型案例数据:触发器的概念和第一个触发器数据库触发器是一个与