数据库原理与应用 第 16 章 · 第五节
课程 › 第 16 章 › 第五节 例题 1例题 2、3例题 4、5例题 6 版式
第 16 章 触发器和事件 · 第五节

创建事件的例子

六个例题:AT 执行一次,EVERY 周期执行,STARTS 和 ENDS,定期调用存储过程
本 节 知 识 点
  1. 13例题 1:立即建表
  2. 14例题 2、3:到指定时刻执行
  3. 15例题 4、5:周期执行
  4. 16例题 6:定期调用存储过程
13
第 16 章 · 第五节 · 课件第 40、41 页合并重做

例题 1:立即建表

AT NOW() 立即执行一次,执行完事件被删除。

16.2 MySQL 事件课件第 40、41 页合并

例题 1:立即执行,建立一张表

建立立刻执行的事件 event_name1,在 teaching 库中建立表 tb_one,字段为 tno 和 ttime,tno 为主码且自动增长,ttime 为 TIMESTAMP。
CREATE EVENT event_name1
ON SCHEDULE AT NOW()
DO
CREATE TABLE tb_one (
  tno INT PRIMARY KEY AUTO_INCREMENT,
  ttime TIMESTAMP
);
  • AT NOW() 表示在当前时刻执行一次
  • 执行 SHOW TABLES,能看到 tb_one
  • 执行完以后 event_name1 自动被删除,SHOW EVENTS 中看不到它
14
第 16 章 · 第五节 · 课件第 42、43、44、45 页合并重做

例题 2、3:到指定时刻执行

当前时刻加一段时间,或者写一个具体的时刻。

16.2 MySQL 事件课件第 42、43、44、45 页合并

例题 2、3:到指定的时刻执行一次

例题 2 10 秒以后插入一条记录
CREATE EVENT event_name2
ON SCHEDULE AT CURRENT_TIMESTAMP
            + INTERVAL 10 SECOND
DO
INSERT INTO tb_one VALUES (0, NOW());
  • 10 秒后查询 tb_one,多了一行
  • tno 写 0,由 MySQL 自动编号
例题 3 在指定的时刻插入
CREATE EVENT event_name3
ON SCHEDULE AT CURRENT_DATE
            + INTERVAL 1 DAY
            + INTERVAL 8 HOUR
DO
INSERT INTO tb_one VALUES (0, NOW());
  • 明天 8 点插入一条记录
  • 时刻已经过去的事件建立后立即被删除,提示 1588
15
第 16 章 · 第五节 · 课件第 46、47、48 页合并重做

例题 4、5:周期执行

EVERY 周期执行,STARTS 和 ENDS 限定时间段。

16.2 MySQL 事件课件第 46、47、48 页合并

例题 4、5:周期执行

例题 4 每 5 秒插入一条记录
CREATE EVENT event_name4
ON SCHEDULE EVERY 5 SECOND
DO
INSERT INTO tb_one VALUES (0, NOW());
  • 建立时执行第一次,以后每 5 秒一次
  • tb_one 中的记录不断增加,ttime 相差 5 秒
例题 5 一周内每小时清空一次
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;
  • 从明天 0 点开始,一周后结束
  • STARTS 开始,ENDS 结束,到期后事件被删除
16
第 16 章 · 第五节 · 课件第 49、50、51、52 页合并重做

例题 6:定期调用存储过程

事件体中调用存储过程,每周汇总一次成绩。

16.2 MySQL 事件课件第 49、50、51、52 页合并

例题 6:定期调用存储过程

建立事件 event_name6,每周调用一次存储过程 pro_score,把每个学生所有课程的平均分和总分,连同插入的时间一起存入 week_score 表。
汇总表
CREATE TABLE week_score (
  sno CHAR(5) NOT NULL,
  avgscore INT,
  sumscore INT,
  updatetime TIMESTAMP
);
  • 验证:SELECT * FROM week_score;
  • 平均分存入 INT 字段时四舍五入
存储过程和事件
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 ;

过程体和事件体都有 BEGIN … END,要先用 DELIMITER 改定界符。

保山学院·人工智能教研室·曹鼎鼎