• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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恢复psc文件记录数为0的解决方案
    • PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
    • MySQL数据库查看数据表占用空间大小和记录数的方法
    • MYSQL速度慢的问题 记录数据库语句
    • MySQL分区表的局限和限制详解
    • MySQL 如何限制一张表的记录数
    上一篇:浅谈mysql explain中key_len的计算方法
    下一篇:deepin 2014系统下安装mysql数据库的方法步骤
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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