查看实验三的事件,修改事件的周期、名称和注释,暂停和恢复事件,最后运行例题 6,再删除全部事件。
MySQL 8.0 和 MySQL Workbench,机房电脑已装好。所有语句在 Workbench 的 SQL 编辑区中执行。
Ctrl+Enter 执行光标所在的一句,Ctrl+Shift+Enter 执行全部。Mac 上把 Ctrl 换成 ⌘。
输入法切到英文。表名、字段名不加引号,字符串值才用单引号。
重建 teaching 库的五张表,打开事件调度器,建立 tb_one 表和实验三的 event_name4、event_name5。
-- 第 16 章实验四数据:五张表、tb_one 表和实验三建立的 event_name4、event_name5 -- 整段执行一次即可,想从头再做时重新执行。 CREATE DATABASE IF NOT EXISTS teaching DEFAULT CHARACTER SET utf8mb4; USE teaching; -- 删除本章实验建立的事件、存储过程和表,表上的触发器随表一起删除 DROP EVENT IF EXISTS event_name1; DROP EVENT IF EXISTS event_name2; DROP EVENT IF EXISTS event_name3; DROP EVENT IF EXISTS event_name4; DROP EVENT IF EXISTS name4; DROP EVENT IF EXISTS event_name5; DROP EVENT IF EXISTS event_name6; DROP PROCEDURE IF EXISTS pro_score; DROP TABLE IF EXISTS update_s_log, tb_one, week_score, t_demo; -- 删除旧的表。先暂时关闭外键检查,库里有别的表引用它们时也能删除 SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS sc, tc, avgsal, classroom, s, c, t; SET FOREIGN_KEY_CHECKS = 1; -- 课程表 CREATE TABLE c ( cno CHAR(4) NOT NULL, cn VARCHAR(30) NOT NULL, ct INT, PRIMARY KEY (cno) ); -- 学生表 CREATE TABLE s ( sno CHAR(4) NOT NULL, sn VARCHAR(20) NOT NULL, sex CHAR(2), age INT, maj VARCHAR(30), dept VARCHAR(30), PRIMARY KEY (sno) ); -- 教师表 CREATE TABLE t ( tno CHAR(4) NOT NULL, tn VARCHAR(20) NOT NULL, sex CHAR(2), age INT, prof VARCHAR(20), maj VARCHAR(30), dept VARCHAR(30), sal DECIMAL(8,2), PRIMARY KEY (tno) ); -- 选课表 CREATE TABLE sc ( sno CHAR(4) NOT NULL, cno CHAR(4) NOT NULL, score DECIMAL(5,2), PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES s (sno), FOREIGN KEY (cno) REFERENCES c (cno) ); -- 授课表 CREATE TABLE tc ( tno CHAR(4) NOT NULL, cno CHAR(4) NOT NULL, tcdate DATE, PRIMARY KEY (tno, cno), FOREIGN KEY (tno) REFERENCES t (tno), FOREIGN KEY (cno) REFERENCES c (cno) ); INSERT INTO c VALUES ('c1','Java程序设计',40), ('c2','程序设计基础',48), ('c3','线性代数',48), ('c4','数据结构',64), ('c5','数据库系统',56), ('c6','数据挖掘',32), ('c7','高等数学',60), ('c8','控制理论',32); INSERT INTO s VALUES ('s1','王彤','女',18,'计算机','信息学院'), ('s2','苏乐','男',20,'信息','信息学院'), ('s3','林欣怡','女',19,'信息','信息学院'), ('s4','陶然','男',19,'自动化','工学院'), ('s5','魏立','男',17,'数学','理学院'), ('s6','何欣荣','女',21,'计算机','信息学院'), ('s7','赵琳琳','女',19,'数学','理学院'), ('s8','李轩','男',18,'自动化','工学院'); INSERT INTO t VALUES ('t1','刘杨','男',38,'教授','计算机','信息学院',3800.00), ('t2','石丽','女',28,'讲师','计算机','信息学院',2800.00), ('t3','顾伟','男',35,'副教授','计算机','信息学院',3200.00), ('t4','赵礼','男',45,'教授','自动化','工学院',4267.90), ('t5','赵希希','女',33,'副教授','数学','理学院',3332.67), ('t6','张刚','男',30,'讲师','计算机','工学院',2600.00); INSERT INTO sc VALUES ('s1','c1',90.50), ('s1','c2',88.00), ('s2','c4',70.00), ('s2','c5',57.00), ('s2','c6',81.50), ('s2','c7',NULL), ('s3','c1',75.00), ('s3','c2',76.50), ('s3','c4',85.00), ('s4','c1',93.00), ('s4','c2',82.00), ('s4','c6',NULL), ('s4','c7',68.00), ('s5','c2',79.00), ('s5','c7',84.00), ('s7','c3',77.00), ('s7','c5',62.00), ('s7','c7',100.00), ('s8','c2',66.00), ('s8','c3',96.00); INSERT INTO tc VALUES ('t1','c1','2021-09-03'), ('t1','c2','2021-09-04'), ('t2','c5','2021-03-06'), ('t2','c6','2021-09-06'), ('t3','c2','2021-03-08'), ('t3','c4','2021-09-08'), ('t4','c3','2021-03-10'), ('t5','c7','2021-09-12'), ('t5','c8','2021-03-15'); -- 打开事件调度器,建立实验三的表和两个事件 SET GLOBAL event_scheduler = ON; CREATE TABLE tb_one (tno INT PRIMARY KEY AUTO_INCREMENT, ttime TIMESTAMP); CREATE EVENT event_name4 ON SCHEDULE EVERY 5 SECOND DO INSERT INTO tb_one VALUES (0, NOW()); CREATE EVENT event_name5 ON SCHEDULE EVERY 1 HOUR STARTS CURRENT_DATE + INTERVAL 1 DAY ENDS CURRENT_DATE + INTERVAL 1 WEEK DO DELETE FROM tb_one; SHOW EVENTS;
SHOW EVENTS; SELECT EVENT_NAME, EVENT_TYPE, INTERVAL_VALUE, INTERVAL_FIELD, STATUS FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'teaching';
| SHOW EVENTS | 显示当前库中的事件 |
| EVENT_TYPE | ONE TIME 只执行一次,RECURRING 周期执行 |
| INTERVAL_VALUE 与 INTERVAL_FIELD | 周期的数值和单位,例如 5 和 SECOND |
SHOW CREATE EVENT event_name5;
| Create Event | 这一列是建立事件的完整语句 |
| STARTS 与 ENDS | MySQL 把 CURRENT_DATE + INTERVAL 这样的表达式换算成了具体的时刻 |
| ON COMPLETION NOT PRESERVE | 没有写时的默认值,事件结束后删除 |
ALTER EVENT event_name4 ON SCHEDULE EVERY 1 MINUTE RENAME TO name4 COMMENT '添加测试用例的注释'; SHOW EVENTS;
| ON SCHEDULE | 重新指定执行的时间 |
| RENAME TO | 修改事件的名称 |
| COMMENT | 修改注释,在 information_schema.EVENTS 的 EVENT_COMMENT 中能看到 |
ALTER EVENT name4 DISABLE; SELECT EVENT_NAME, STATUS FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'teaching'; ALTER EVENT name4 ENABLE; ALTER EVENT event_name5 ON COMPLETION PRESERVE; SELECT EVENT_NAME, STATUS, ON_COMPLETION FROM information_schema.EVENTS WHERE EVENT_SCHEMA = 'teaching';
| DISABLE | 暂停事件,事件还在,但不再执行 |
| ENABLE | 恢复执行 |
| ON COMPLETION PRESERVE | 事件到期后保留,状态变为 DISABLED,不被删除 |
CREATE TABLE week_score ( sno CHAR(5) NOT NULL, avgscore INT, sumscore INT, updatetime TIMESTAMP ); DELIMITER $$ CREATE PROCEDURE pro_score() BEGIN INSERT INTO week_score SELECT sno, AVG(score), SUM(score), NOW() FROM sc GROUP BY sno; END $$ CREATE EVENT event_name6 ON SCHEDULE EVERY 1 WEEK DO BEGIN CALL pro_score(); END $$ DELIMITER ;
-- 过 3 秒以后再执行下面的语句 SELECT * FROM week_score; DROP EVENT IF EXISTS event_name6; DROP EVENT IF EXISTS event_name5; DROP EVENT IF EXISTS name4; SHOW EVENTS;
| DELIMITER | 过程体和事件体都有 BEGIN … END,要先改定界符 |
| EVERY 1 WEEK | 建立后立刻执行第一次,以后每周一次 |
| avgscore INT | 平均分存入整型字段时四舍五入,例如 89.25 存为 89 |
| 最后 | 删除全部事件,免得周期事件一直执行 |