最近公司有个需求,需要将MySQL中某一张表中的某几个固定的字段定时同步到另外一张表中,且字段名称需要变更。至于为什么会这么做,不详细描述,大体原因是公司奇葩。
- 首先检查是否开启了定时任务,需要用到一下代码
查看event是否开启 : SHOW VARIABLES LIKE '%event_sche%';
将事件计划开启 : SET GLOBAL event_scheduler = 1;
将事件计划关闭 : SET GLOBAL event_scheduler = 0;
关闭事件任务 : ALTER EVENT eventName ON COMPLETION PRESERVE DISABLE;
开启事件任务 : ALTER EVENT eventName ON COMPLETION PRESERVE ENABLE;
查看事件任务 : SHOW EVENTS;
- 创建一个存储过程
DROP PROCEDURE IF EXISTS `create_mes_sync_record`;
DELIMITER ;;
CREATE PROCEDURE `create_mes_sync_record` #创建一个名为create_mes_sync_record的存储过程
COMMENT '同步MES数据'
BEGIN
insert into mes_sync (
vin, sn, car_conf_code,
series_code, series_name, product_time, created_at, updated_at, del_flag
) select
res.vin_code, res.btm_sn,
concat(res.type_code, '.', res.car_code),
res.option_code, res.option_code, res.update_time, NOW()+interval 8 hour, NOW()+interval 8 hour, 0 #这里的时间+8小时因为mysql在docker容器中,而容器时间与北京时间相差8小时
from
(select * from btm_check_result b
where vin_code not in (
select vin from mes_sync m)) res
END
;;
DELIMITER ; #总体来说,就是把btm_check_result中的一部分字段重命名后插入mes_sync表中
- 设置一个定时任务,调用这个存储过程
DELIMITER //
DROP EVENT IF EXISTS event_mes_sync_record//
CREATE EVENT event_mes_sync_record
on schedule EVERY 1 DAY STARTS date_add(curdate(),interval 1 DAY_HOUR) #射箭间隔为每天,开始时间为现在的日期的凌晨0点,加上1小时(即凌晨1点)
do
BEGIN
call create_mes_sync_record;
END//
DELIMITER ;
这样就可以了,如果不放心,可以使用SHOW EVENTS命令来查看定时任务是否生效