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

 更新时间:2017年04月05日 11:08:54   投稿:lqh  
这篇文章主要介绍了MySQL通过触发器解决数据库中表的行数限制详解及实例的相关资料,需要的朋友可以参考下

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

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

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报错:

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 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已开启,可执行

 GLOBAL event_scheduler = 1;

或者

SET GLOBAL event_scheduler = ON;

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

SHOW VARIABLES LIKE 'event_scheduler';

SELECT @@event_scheduler;


SHOW PROCESSLIST;

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

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查找字符串函数的使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 浅析MySQL显式类型转换

    浅析MySQL显式类型转换

    这篇文章主要介绍了MySQL显式类型转换的基础知识,通过实例给出了分析结果,一起学习下吧。
    2017-12-12
  • 登录MySQL时出现Authentication plugin ‘caching_sha2_password‘ reported error错误的解决方案

    登录MySQL时出现Authentication plugin ‘caching_sha2_pass

    这篇文章主要介绍了登录MySQL时出现Authentication plugin ‘caching_sha2_password‘ reported error错误的解决方案,文中通过图文结合的形式讲解的非常详细,对大家的解决问题有一定的帮助,需要的朋友可以参考下
    2024-12-12
  • MySQL5.7 JSON类型使用详解

    MySQL5.7 JSON类型使用详解

    MySQL5.7发布后,专门设计了JSON数据类型以及关于这种类型的检索以及其他函数解析。 我们先看看MySQL老版本的JSON存取方式,具体内容详情大家参考下本文吧
    2017-10-10
  • 解决windows下mysql8修改my.ini设置datadir后无法启动问题

    解决windows下mysql8修改my.ini设置datadir后无法启动问题

    在修改MySQL的my.ini文件以更改数据目录后,可能会遇到无法启动的问题,这通常是因为字符编码被改变或新路径权限不足,正确的做法是备份my.ini文件,确保使用ANSI字符编码修改datadir,并确保新路径有足够的权限,特别是SYSTEM或NETWORKSERVICE权限
    2025-01-01
  • Mysql服务器的启动与停止(二)

    Mysql服务器的启动与停止(二)

    Mysql服务器的启动与停止(二)...
    2006-11-11
  • 如何修改mysql的隔离级别

    如何修改mysql的隔离级别

    MySQL的隔离级别是指数据库事务的隔离程度,用于控制并发事务之间的相互影响,本文就详细的介绍一下如何修改mysql的隔离级别,感兴趣的可以了解一下
    2023-08-08
  • Centos MySQL 5.7安装、升级教程

    Centos MySQL 5.7安装、升级教程

    这篇文章主要为大家详细介绍了Centos MySQL 5.7安装、升级教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • mysql动态游标学习(mysql存储过程游标)

    mysql动态游标学习(mysql存储过程游标)

    mysql动态游标示例,通过准备语句、视图和静态游标实现,大家参考使用吧
    2013-12-12
  • mysql存储过程之错误处理实例详解

    mysql存储过程之错误处理实例详解

    这篇文章主要介绍了mysql存储过程之错误处理,结合实例形式详细分析了mysql存储过程错误处理相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2019-12-12

最新评论