数据库原理与应用 第 16 章 · 第三节
课程第 16 章第三节 先建表例题二看结果跑几遍例题三 版式
第 16 章 触发器和事件 · 第三节

三个例子:校验、记日志、级联

本 节 知 识 点
  1. 15日志表五列
  2. 16改专业时自动记一条日志
  3. 17一条修改记录
  4. 18FOR EACH ROW 那句话的分量
  5. 19删学生连他的选课一起删
15
第 16 章 · 第三节

日志表五列

学号、姓名、旧专业、新专业、修改时间。

第 15 页课件

重 点

omaj 存 OLD.maj,nmaj 存 NEW.maj,名字里的 o 和 n 就是这么来的。

知道更多

日志表要先建好,表不在的话触发器建得上,改数据时才报 1146。

打个比方

账本得先摆在桌上,记账的人才落得下笔。

想一想

表还没建就先建触发器,会在哪一步报错?

16
第 16 章 · 第三节

改专业时自动记一条日志

AFTER UPDATE 里往日志表插一行,OLD 和 NEW 都用上。

第 16 页课件

试一试日志那一行是怎么拼出来的

点一格看它从哪儿来
OLD.sno,OLD.sn,OLD.maj,NEW.maj,now()
snosnomajnmajudate
s2苏乐信息计算机16:18:53

重 点

记日志用 AFTER:数据已经改成事实了,记下来才作数。

上机做

上机二第 2 题 记一条日志

17
第 16 章 · 第三节

一条修改记录

旧专业信息,新专业计算机,时间是 now() 现算的。

第 17 页课件

重 点

同一张表上 OLD 和 NEW 的列名一样,靠前缀分清是哪一份。

练一练

把 OLD.maj 和 NEW.maj 写反了,日志会怎样?
  1. A报错建不起来
  2. B记反了但不报错
  3. C两列都是新专业
答案 B

两个都合法,写反了库也照收,日志从此全是错的,这种错最难查。

想一想

这条日志是谁改的,表里看得出来吗?

18
第 16 章 · 第三节

FOR EACH ROW 那句话的分量

一条语句命中四行,触发器就跑四遍。

第 18 页课件

试一试换个 WHERE 看跑几遍

这一条 UPDATE 的 WHERE
命中几行触发器跑几遍日志表多几行

重 点

Rows matched 是几,日志表就多几行,不是一句一次。

知道更多

命中却一个字没改,触发器照样跑,这一条课件没说。

上机做

上机二第 3 题 数一数

想一想

WHERE 一行都没命中呢?

19
第 16 章 · 第三节

删学生连他的选课一起删

BEFORE DELETE 先清子表,父行才删得动。

第 19 页课件

试一试删一个学生牵动几张表

走一步
s 表 s1 这一行
sc 表里 s1 的选课

重 点

必须是 BEFORE:sc 还引着 s1,先删子表这一关才过得去。

上机做

上机二第 5 题 级联删一次

想一想

改成 AFTER DELETE 会卡在哪一步?

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