mysql 触发器和任务事件(定时器任务事件)
触发器语法
查看触发器
show triggers;
CREATE TRIGGER <trigger_name>
BEFORE|AFTER
INSERT|UPDATE|DELETE ON <table_name> # 表名
FOR EACH ROW # 这句话在mysql是固定的
BEGIN
<触发的SQL语句>(调用NEW/OLD参数);
END
举例
CREATE TRIGGER cfq1
AFTER
INSERT ON student
FOR EACH ROW
BEGIN
insert into student_point ( name, point)
values( NEW.name, NEW.age); -- NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据
END
意思就是在给student表插入数据之后,自动在student_point表钟插入新数据的姓名和年龄。
定时任务事件语法
二、开启事件功能
先检查是否开启事件功能:
show variables like 'event_scheduler';
如果’event_scheduler’的值为 'ON’表示调度器已开启,'OFF’为调度器未开启
开启事件:set global event_scheduler = on;
关闭事件:set global event_scheduler = off;
查看任务 SHOW EVENTS;
这个是查看现有任务,如果有任务只执行一次的话,执行之前是可以看到的,执行之后就没有了就查不到了。
创建定时任务事件语法
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO event_body;
时间有很多种的,
on schedule every 1 second -- 每秒执行1次
on schedule every 2 minute -- 每两分钟执行1次
on schedule every 3 day -- 每3天执行1次
ON schedule every 1 day starts date_add(date_add_curdate(), interval 1 day), interval 1 hour) -- 每天凌晨1点执行
ON schedule every 1 month starts date_add(date_add(date_sub(curdatte(),interval day(curdate())-1 day),interval 1 month),interval 1 hour) -- 每个月的第一天凌晨1点执行
on schedule at current_timestamp()+interval 5 day -- 5天后执行
on schedule at current_timestamp()+interval 10 minute -- 10分钟后执行
on schedule at '2016-10-01 21:50:00' -- 在2016年10月1日,晚上9点50执行
ON schedule EVERY 3 MONTH STARTS CURRENT_TIMESTAMP + 1 WEEK -- 每 3 个月,从现在起一周后开始
ON schedule EVERY 12 HOUR STARTS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE ENDS CURRENT_TIMESTAMP + INTERVAL 4 WEEK -- 每十二个小时,从现在起三十分钟后开始,并于现在起四个星期后结束
on schedule every 1 day starts current_timestamp()+interval 5 day ends current_timestamp()+interval 1 month -- 5天后开始每天都执行执行到下个月底
on schedule every 1 day ends current_timestamp()+interval 5 day -- 从现在起每天执行,执行5天
举例:
创建一个1分钟后清空student_point表数据的事件
CREATE EVENT IF NOT EXISTS dsq1
on schedule at current_timestamp()+interval 1 minute -- 1分钟后执行
DO
TRUNCATE TABLE student_point;
创建一个每天凌晨1点执行的任务
CREATE EVENT my_event
ON SCHEDULE
EVERY 1 DAY
STARTS CURRENT_TIMESTAMP + INTERVAL 1 DAY
ON COMPLETION PRESERVE
DO
-- 这里是任务的具体操作,可以是SQL语句或存储过程
INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2');
创建一个每隔3秒往test表中插入一条数据的事件
CREATE EVENT IF NOT EXISTS e_test_1
ON SCHEDULE
EVERY 3 SECOND
ON COMPLETION PRESERVE
DO
INSERT INTO test(id,t1) VALUES(NULL,NOW());
查看全部事件:
SHOW EVENTS;
删除事件:
DROP EVENT [IF EXISTS] event_name(事件名称);
例如:DROP EVENT event_name;
事件任务参考:https://blog.csdn.net/weixin_44816664/article/details/134206285
触发器参考:https://zhuanlan.zhihu.com/p/158670286