答:Navicat可以设置远程服务器,如果你连接的是远程服务器数据库那么就是设置到远程服务器的mysql中,而不是本机中,其实归根揭底这种方式就是在服务器上设置了一个mysql存储过程,然后定时调用这个存储过程而已;所以与你自己本地电脑上安装的Navicat软件无关,删除也没有问题的。
1.查看是否开启定时任务
show variables like 'event_scheduler';
查看event_scheduler如果为OFF或0就表示关闭
//开启命令-查询中运行
set global event_scheduler = on;
2.设置重启服务器(重启mysql服务)继续执行
提醒:虽然这里用set global event_scheduler = on语句开启了事件,但是每次重启电脑。或重启mysql服务后,会发现,事件自动关闭(event_scheduler=OFF),所以想让事件一直保持开启,最好修改配置文件,让mysql服务启动的时候开启时间,只需要在my.ini配置文件的[mysqld]部分加上event_scheduler=ON 即可,如下:
二、删除表7天以前的数据(开始创建自动运行脚本)例子:删除表7天以前的数据
2.1 创建函数选项:过程
CREATE DEFINER=`创建时自动添加的`@`%` PROCEDURE `del_chat_7d`()
BEGIN
#用于删除访客与客服聊天记录7天表,只保留最近7天数据
#定义变量
DECLARE done int DEFAULT(0);#游标标记
DECLARE timestampTmp INT;#时间戳
DECLARE eid INT DEFAULT(0);
DECLARE err INT DEFAULT(0); #是否有sql错误
#创建游标,并且存储数据,获取未处理,已结束的广告活动id
DECLARE cur_ad CURSOR
FOR
SELECT id FROM 库.表;#列出所有企业ID
#游标中的内容执行完后将done设置为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
#检查sql是否有错
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
DECLARE CONTINUE HANDLER FOR 1146 SET err=0; #没有表的错误码-跳过当前循环往下走
DECLARE CONTINUE HANDLER FOR 1243 SET err=0; #没有处理错误的错误码循环-跳过当前循环往下走
#赋值当前时间
SET timestampTmp = UNIX_TIMESTAMP(CURDATE())-7*24*3600;#7天前时间戳-零点以前
#打开游标
OPEN cur_ad;
#执行循环
posLoop:LOOP
#游标结束或者SQL错误,结束循环
-- SELECT done;#SELECT=打印=echo=输出执行完整状态
-- SELECT err; #SELECT=打印=echo=输出错误状态
IF done = 1 or err = 1 THEN
LEAVE posLoop;#退出循环-不能删除,不然进入死循环
END IF;
#取游标中的值
FETCH cur_ad INTO eid;
SELECT eid;#SELECT=打印=echo=输出 输出表名
#删除数据7天以前的数据
#@STMT作用是因为表名是变量
set @STMT=CONCAT("DELETE FROM dc_chat_",eid,"_7d where time < ",timestampTmp,";");
-- SELECT @STMT;#打印出sql语句
PREPARE STMT FROM @STMT;
EXECUTE STMT;
#结束循环
END LOOP posLoop;
#释放游标
CLOSE cur_ad;
END
2.2 创建事件
代码:调起刚刚创建的函数
call del_chat_7d()
每天执行一次,从2022-02-18 03:00:00开始执行
上图AT表示该事件只执行一次
EVERY表示可多次重复执行,前面1表示循环的周期,DAY表示周期-每天(当然这里有很多选择,月,周,小时等等)
STARTS是一个 timestamp 值表示事件开始时间
+INTERVAL表示间隔以指定「由现在开始」的时间量
ENDS表示事件的结束时间
上图所设置的就表示:从2020年五月27号开始,每天0点执行
用REPLACE INTO复制数据,一定要有作为唯一字段(自增ID)或索引,不然不能判断是否相同数据来更新;没有自增ID就要设置唯一联合索引
联合唯一索引设置:
第一种:表中有自增ID字段,那么只能把字段全部写出(把ID字段去掉)
第二种:表没ID自增字段,但是有唯一联合索引,索引用于判断是否同一条记录
第一种缺点表中第个字段都要写出来;第二种不用写表字段
//表字段:id,title,type,statu
//1.不判断重复数据,有相同数据都当新数据插入
INSERT INTO `power_node`(title,type,status) SELECT title,type,status FROM power_node WHERE id < 5;
//2.判断重复数据,有相同数据更新数据(但是数据中要唯一的联合索引)
REPLACE INTO `power_node` SELECT * FROM power_node WHERE id < 5;
创建函数,并创建事件,按上面一样的设置
CREATE DEFINER=`fncmscom`@`%` PROCEDURE `card_7d_goto_3m`()
BEGIN
#1.把7天表中超过7天的数据移动到3月表中,同时把超过7天的从7天表中删除-dc_chat_card_x_
#2.把3月表中超过3月的数据移动到3月之前表中,同时把超过3月的从3月表中删除-dc_chat_card_x_
#定义变量
DECLARE done int DEFAULT(0);#游标标记
DECLARE timestampTmp7d INT;#时间戳-7天-7d
DECLARE timestampTmp3m INT;#时间戳-3月-3m
DECLARE eid INT DEFAULT(0);
DECLARE err INT DEFAULT(0); #是否有sql错误
#创建游标,并且存储数据,获取未处理,已结束的广告活动id
DECLARE cur_ad CURSOR
FOR
#SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME like 'dc_chat_%_7d';
SELECT id FROM www_datacms_com.dc_enterprise;#列出所有企业ID
#游标中的内容执行完后将done设置为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
#检查sql是否有错
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1;
DECLARE CONTINUE HANDLER FOR 1146 SET err=0; #没有表的错误码-跳过当前循环往下走
DECLARE CONTINUE HANDLER FOR 1243 SET err=0; #没有处理错误的错误码循环-跳过当前循环往下走
#赋值当前时间
SET timestampTmp7d = UNIX_TIMESTAMP(CURDATE())-7*24*3600;#7天前时间戳-零点以前
SET timestampTmp3m = UNIX_TIMESTAMP(CURDATE())-90*24*3600;#90天前时间戳-零点以前
#打开游标
OPEN cur_ad;
#执行循环
posLoop:LOOP
#游标结束或者SQL错误,结束循环
-- SELECT done;#SELECT=打印=echo=输出执行完整状态
-- SELECT err; #SELECT=打印=echo=输出错误状态
IF done = 1 or err = 1 THEN
LEAVE posLoop;#退出循环-不能删除,不然进入死循环
END IF;
#取游标中的值
FETCH cur_ad INTO eid;
-- SELECT eid;#SELECT=打印=echo=输出 输出表名
#1.插入-把7天表中超过7天的数据移动到3月表中
#@STMT作用是因为表名是变量
#REPLACE into 作用当存在数据就修改没有新增加,但是不能自增ID字段,我们设置了唯一的联合索引uid
set @STMT=CONCAT("REPLACE into dc_chat_card_",eid,"_3m select * from dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#在3月表中插入7天表中超过7天的数据
-- set @STMT=CONCAT("REPLACE into dc_chat_card_",eid,"_3m(",allfield,") select ",allfield," from dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#在3月表中插入7天表中超过7天的数据
-- set @STMT=CONCAT("SELECT * FROM dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#查询超过7天的数据
SELECT @STMT;#打印出sql语句
PREPARE STMT FROM @STMT;
EXECUTE STMT;
#2.删除-把7天表中超过7天的数据删除
set @STMT=CONCAT("DELETE FROM dc_chat_card_",eid,"_7d where time < ",timestampTmp7d,";");#删除
SELECT @STMT;#打印出sql语句
PREPARE STMT FROM @STMT;
EXECUTE STMT;
#结束循环
END LOOP posLoop;
#释放游标
CLOSE cur_ad;
END
参考:
https://blog.csdn.net/weixin_44052462/article/details/106380101
https://blog.csdn.net/baochao95/article/details/45951201
MySQL数据篇(九)--存储过程实现定时每天清理过期数据 - 在斑马线上散布 - 博客园
mysql事件每天执行一次_MySQL-事件_真力 GENELEC的博客-CSDN博客
https://blog.csdn.net/laowang2915/article/details/79665001
https://www.cnblogs.com/chenpi/p/5137310.html
https://blog.csdn.net/xishining/article/details/85241941
https://blog.csdn.net/z919167107/article/details/90550912
https://www.cnblogs.com/xiaozhouyuxiaohou/p/9184248.html
https://www.cnblogs.com/camg/p/11890448.html
https://blog.csdn.net/business122/article/details/7528859
https://www.jianshu.com/p/cb0152efac32
https://blog.csdn.net/ruohan520/article/details/4694777
https://blog.csdn.net/weixin_32873435/article/details/113540671
https://blog.csdn.net/iteye_12421/article/details/82075393
https://blog.csdn.net/qq_34769161/article/details/88247203
https://blog.csdn.net/fengchengwu2012/article/details/106240161
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)