数据库原理与应用 第 16 章 · 上机二
课程第 16 章上机二 先建日志表记日志跑几遍改了零行级联删除动自己那张表连续练习 版式
第 16 章 触发器和事件 · 上机二

校验、记日志、级联删,三个跑一遍

课件第 15 到 19 页的三个例题原样敲一遍,外加两件课件没说的:跑几遍,和改零行也跑。
已完成 0 / 6
本 次 上 机 题 目
  1. 01例题 2 的第一步
  2. 02AFTER UPDATE:改完才记
  3. 03FOR EACH ROW 那句话的分量
  4. 04不报错的那一种
  5. 05例题 3:删学生连他的选课一起删
  6. 061442:转不出来了
  7. 三种触发器各来一个
01
第 16 章 · 上机二

例题 2 的第一步

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

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往表上挂触发器、往库里放事件。
mysql>

重 点

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

想一想

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

02
第 16 章 · 上机二

AFTER UPDATE:改完才记

OLD 和 NEW 同时用上,这是 UPDATE 触发器的典型样子。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往表上挂触发器、往库里放事件。
mysql>

重 点

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

知道更多

五个值:前三个来自 OLD,第四个来自 NEW,最后一个是 now() 现算的。

03
第 16 章 · 上机二

FOR EACH ROW 那句话的分量

一条 UPDATE 命中四行,日志一下多四行。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往表上挂触发器、往库里放事件。
mysql>

重 点

回显说 Rows matched: 4,日志表就多四行,一行一次,不是一句一次。

知道更多

把 WHERE 去掉,八行全命中,日志一下多八行,写触发器前先想清这一点。

想一想

要是 WHERE 一行都没命中呢?

04
第 16 章 · 上机二

不报错的那一种

新值和旧值一模一样,Changed 是 0,日志却还是多一条。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往表上挂触发器、往库里放事件。
mysql>

重 点

触发器认的是「命中」,不是「改动」。命中就点火,改没改它不管。

知道更多

Rows matched 是 1,Changed 是 0,日志却多一条,三个数字要分开看。

想一想

那日志表里这一条记的旧专业和新专业长什么样?

05
第 16 章 · 上机二

例题 3:删学生连他的选课一起删

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

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往表上挂触发器、往库里放事件。
mysql>

重 点

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

知道更多

顺序是先子后父:sc 里那两行先删掉,s1 才过得了外码这一关。

想一想

改成 AFTER DELETE 会在哪一步卡住?

06
第 16 章 · 上机二

1442:转不出来了

触发器里再去改触发它的那张表,真机直接拦下。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往表上挂触发器、往库里放事件。
mysql>

重 点

建的时候不报,等真去插一行才报 1442,这个坑埋得比较深。

知道更多

想在同一张表上改值,用 BEFORE 里的 SET NEW.列,不要再写一句 INSERT。

想一想

改成往另一张表插,还会报吗?

第 16 章 · 上机二

三种触发器各来一个

校验、记日志、级联,一次把三种时机都用上。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开就在 teaching 库里,五张表已经装好。这一章要往表上挂触发器、往库里放事件。
mysql>

重 点

180 被 BEFORE 拨回 100,改成 88 时 AFTER 记下 100 到 88 这一笔。

想一想

日志里 old_s 记的是 180 还是 100?

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