mysql自动删除7天以上数据存储过程(定时触发器)

  自动删除mysql中7天以上的行的存储过程

 MysqL具有其EVENT功能,可避免您计划的大部分与sql有关,而与文件无关的情况下避免复杂的cron交互。请参见此处的手册页面。希望以下内容可以作为重要步骤和要考虑事项以及可验证测试的简要概述。

  

show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+

糟糕,事件调度程序未打开。什么都不会触发。

SET GLOBAL event_scheduler = ON; -- turn her on and confirm below
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

测试架构

create table theMessages
(   id int auto_increment primary key,
    userId int not null,
    message varchar(255) not null,
    updateDt datetime not null,
    key(updateDt)
    -- FK's not shown
);
-- it is currently 2015-09-10 13:12:00
-- truncate table theMessages;
insert theMessages(userId,message,updateDt) values (1,'I need to go Now, no followup questions','2015-08-24 11:10:09');
insert theMessages(userId,message,updateDt) values (7,'You always say that ... just hiding','2015-08-29');
insert theMessages(userId,message,updateDt) values (1,'7 day test1','2015-09-03 12:00:00');
insert theMessages(userId,message,updateDt) values (1,'7 day test2','2015-09-03 14:00:00');

创建2个事件,每天运行1次,每10分钟运行2次

忽略他们实际在做什么(互相对抗)。重点是time difference方法和 。

DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
  ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   delete from theMessages 
   where datediff(Now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
   -- etc etc all your stuff in here
END;$$
DELIMITER ;
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
  ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
  ON COMPLETION PRESERVE
DO BEGIN
   delete from theMessages 
   where TIMESTAMPDIFF(HOUR, updateDt, Now())>168; -- messages over 1 week old (168 hours)
   -- etc etc all your stuff in here
END;$$
DELIMITER ;

显示事件状态(不同的方法

show events from so_gibberish; -- list all events by schema name (db name)
show events; -- <--------- from workbench / sqlyog
show events\G;` -- <--------- I like this one from MysqL> prompt
*************************** 1. row ***************************
                  Db: so_gibberish
                Name: delete7DayOldMessages
             Definer: root@localhost
           Time zone: SYstem
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: DAY
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
                  Db: so_gibberish
                Name: Every_10_Minutes_Cleanup
             Definer: root@localhost
           Time zone: SYstem
                Type: RECURRING
          Execute at: NULL
      Interval value: 10
      Interval field: MINUTE
              Starts: 2015-09-01 00:00:00
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.06 sec)

 

随机的东西要考虑

drop event someEventName; -<-----要了解的一件好事

无法别名datediff并在1行的where子句中使用,因此

select id,DATEDIFF(Now(),updateDt) from theMessages where datediff(Now(),updateDt)>6;

获得更精确的信息,1周龄为168小时

select id,TIMESTAMPDIFF(HOUR, updateDt, Now()) as `difference` FROM theMessages;
+----+------------+
| id | difference |
+----+------------+
|  1 |        410 |
|  2 |        301 |
|  3 |        169 |
|  4 |        167 |
+----+------------+

手册页的链接显示了很多灵活的间隔选择,如下所示:

间隔:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
          WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
          DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

 

 

如何让数据库的某张表在记录达到100条的时候自动删除记录

创建表 user

CREATE TABLE `user` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
  `name` varchar(20) NOT NULL DEFAULT '' COMMENT '名字',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

表结构如下

 

 然后创建触发器使用存储过程定时清除记录

CREATE EVENT `delete_table_trigger`
ON SCHEDULE EVERY 1 SECOND STARTS '2000-01-01 00:00:00'
ON COMPLETION NOT PRESERVE
ENABLE
DO
delete from user where (select num from (select count(id) as num from user as tmp) as t)>100;

创建完毕后,用数据库管理工具phpmyadmin看一下这个数据库的事件

 

 

然后尝试往里面插入数据

插入100条,

 

 再插入一条 就会触发触发器进行清空记录了,

 

 达到了当记录大于100的时候自动清空数据

 

https://www.jb51.cc/faq/928182.html

https://www.baidu.com/link?url=htdYnYOgS5dT6c_xVeCEFxXrJiBM_HmP5YJoRCQJvkhr2tUpFg36I--GQcfataff2dBP0Jdh8EazGLCPrKulvK&wd=&eqid=98a5e6ff000125a700000005636c6222

posted @ 2022-11-10 10:50  wq9  阅读(866)  评论(0)    收藏  举报