数据库原理与应用 第 16 章 · 第六节
课程第 16 章第六节 例题一表出来了例题二多了一行例题三第二行例题四一直在长例题五例题六过程事件查汇总表 版式
第 16 章 触发器和事件 · 第六节

创建事件:课件的六个例子

本 节 知 识 点
  1. 40立刻执行:建一张表
  2. 41SHOW tables 里多了 tb_one
  3. 42十秒后插一行
  4. 43表里多了一行
  5. 44指定一个具体时刻
  6. 45第二行进来了
  7. 46每五秒插一行
  8. 47行一直在长
  9. 48框在一周里,每小时清一次
  10. 49先建一张汇总表
  11. 50再建一个存储过程
  12. 51让事件每周叫一次这个过程
  13. 52查一眼汇总表
40
第 16 章 · 第六节

立刻执行:建一张表

AT now() 就是现在,调度器一看到它就跑。

第 40 页课件

重 点

事件体里能写建表这种语句,它就是一段普通的 SQL。

知道更多

调度器要是关着,这一句建得上,可 tb_one 并不会出现。

上机做

上机四第 1 题 先不开调度器

41
第 16 章 · 第六节

SHOW tables 里多了 tb_one

表是事件建的,不是你建的。

第 41 页课件

重 点

调度器一打开,时刻早过了的事件会马上补跑一次。

知道更多

SET GLOBAL 只管这一次开机,要一直开着得写进配置文件再重启。

上机做

上机四第 2 题 打开调度器

想一想

补跑这一下算不算迟到?

42
第 16 章 · 第六节

十秒后插一行

AT 后面写当前时刻加一个间隔,就是往后推。

第 42 页课件

重 点

CURRENT_TIMESTAMP + INTERVAL 10 SECOND 算出来是一个具体时刻。

知道更多

tno 那一列写的是 0,自增列上写 0 等于让服务器接着发号。

上机做

上机四第 3 题 让时间过去

43
第 16 章 · 第六节

表里多了一行

tno 是 1 不是 0,时间是事件跑起来那一刻。

第 43 页课件

练一练

插入时 tno 写的是 0,为什么查出来是 1?
  1. A0 被当成空值
  2. B自增列上写 0 等于让服务器发号
  3. C主键不能是 0
答案 B

自增列上写 0 或 NULL,MySQL 都当成「你来发号」,接着上一个往下排。

想一想

再等十秒,还会不会又多一行?

44
第 16 章 · 第六节

指定一个具体时刻

AT 后面直接写一个日期时间字符串。

第 44 页课件

重 点

写死的时刻要是已经过去了,事件建完当场就被删掉。

练一练

「明天上午十点把临时表清一次,只清这一次」该怎么写?
  1. AON SCHEDULE EVERY 1 DAY
  2. BON SCHEDULE AT 那个时刻
  3. CON SCHEDULE EVERY 1 DAY ENDS 明天
答案 B

只跑一次就用 AT,EVERY 是周期性的,加了 ENDS 也还是要跑好几遍。

试一试时刻过去了会怎样

AT 写的时刻
回显SHOW EVENTS 查得到吗

上机做

上机四第 5 题 写一个过去的时刻

45
第 16 章 · 第六节

第二行进来了

两行的时间正好差着两次执行的间隔。

第 45 页课件

重 点

一次性事件跑完就自己没了,SHOW EVENTS 里再也找不到它。

知道更多

ON COMPLETION PRESERVE 能把它留下来,留下来的状态是 DISABLED。

打个比方

一次性事件像一张用完就作废的票,留着也只是个存根。

想一想

想让它跑完还留着,该加哪个子句?

46
第 16 章 · 第六节

每五秒插一行

EVERY 后面写间隔,跑完接着排下一次。

第 46 页课件

试一试两条时间线并排走

时钟往前走
写法跑过几次还会不会再跑

重 点

周期性事件建完先跑一次,不必等满一个周期。

上机做

上机四第 4 题 每五秒跑一次

47
第 16 章 · 第六节

行一直在长

时间戳相邻两行正好差五秒。

第 47 页课件

重 点

不删它就一直跑下去,写 EVERY 之前先想清楚它什么时候停。

知道更多

线上误建一个每秒跑的事件,一天就能灌进八万多行。

记牢它写 EVERY 前先问

  1. 多久跑一次
  2. 什么时候起跑
  3. 什么时候收工

想一想

怎么让它跑一周就自动停?

48
第 16 章 · 第六节

框在一周里,每小时清一次

STARTS 定起跑线,ENDS 定收工时刻。

第 48 页课件

重 点

ENDS 到了事件自己删掉,不用你再去 DROP 一次。

知道更多

CURRENT_DATE + INTERVAL 1 WEEK 算的是一周后的零点,不是此刻加一周。

上机做

上机四第 6 题 框一个时间窗

49
第 16 章 · 第六节

先建一张汇总表

学号、平均分、总分、插入时间四列。

第 49 页课件

重 点

avgscore 定成 INT,平均分的小数存进去会被四舍五入掉。

知道更多

第 14 章讲过这一条:类型定窄了不报错,精度悄悄就没了。

打个比方

拿一把只认整数的尺子去量,量出来当然是整数。

想一想

89.25 存进 INT 会变成多少?

50
第 16 章 · 第六节

再建一个存储过程

一句 INSERT…SELECT 把每个人的平均分总分算出来。

第 50 页课件

重 点

课件这一段有 BEGIN…END 却没写 DELIMITER,照抄进 mysql> 必报 1064。

知道更多

同一份课件第 13 页建触发器时是写了 DELIMITER 的,这里漏了。

上机做

上机五第 6 题 照抄撞一次

51
第 16 章 · 第六节

让事件每周叫一次这个过程

事件体里一句 CALL,活儿是过程干的。

第 51 页课件

重 点

事件负责定时,过程负责干活,两样各管一头。

知道更多

这一段同样漏了 DELIMITER,跟上一页是同一个毛病。

上机做

上机五第 6 题 先照抄撞一次

想一想

为什么不把那句 INSERT 直接写进事件里?

52
第 16 章 · 第六节

查一眼汇总表

每个学生一行,平均分是整数。

第 52 页课件

重 点

一条 INSERT 一次插进七行,七行的时间戳是同一个值。

练一练

平均分 89.25 存进 INT 列,表里存的是什么?
  1. A89.25
  2. B89
  3. C报错插不进去
答案 B

MySQL 把小数四舍五入成整数再存,不报错,精度就这么悄悄丢了。

想一想

想留住小数,这一列该定成什么类型?

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