数据库原理与应用 第 16 章 · 上机一
课程第 16 章上机一 照课件建第一个验一下写OLD写NEWAFTER改不改定界符连续练习 版式
第 16 章 触发器和事件 · 上机一

NEW 和 OLD,各自认哪一半

课件第 6 到 14 页那三件事:BEFORE 与 AFTER、NEW 与 OLD、写一个能跑的触发器。
已完成 0 / 6
本 次 上 机 题 目
  1. 01例题 1:成绩为空就改成 0
  2. 02插一条成绩为空的记录
  3. 031363:插入哪来的旧值
  4. 041363 的另一半
  5. 051362:来不及了
  6. 061064:老问题又来一遍
  7. 自己写一个:负分改成 0
01
第 16 章 · 上机一

例题 1:成绩为空就改成 0

BEFORE INSERT 里改 NEW,换的是将要写进去的那个值。

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

重 点

触发器体里有分号,跟存储过程一样先改定界符,这是第 15 章留下的规矩。

知道更多

FOR EACH ROW 必须写,它说的是「命中的每一行都跑一遍」。

02
第 16 章 · 上机一

插一条成绩为空的记录

写进去的是 0 不是 NULL,触发器在落盘前把它改了。

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

重 点

c8 那一行 score 是 0.00,c7 还是 NULL,因为 c7 是建触发器之前就有的。

知道更多

课件第 14 页那张结果表第一行是 s2 苏乐 信息,那是 s 表的行串进来了,sc 表没有这一行。

想一想

触发器只管以后插的,还是连老数据一起改?

03
第 16 章 · 上机一

1363:插入哪来的旧值

INSERT 触发器里没有 OLD,建的时候就拦下来了。

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

重 点

报的是 1363,而且是建的时候就报,不用等到真去插一行。

记牢它对应关系

  1. 插入只有 NEW
  2. 删除只有 OLD
  3. 修改两个都有
04
第 16 章 · 上机一

1363 的另一半

DELETE 触发器里没有 NEW,同样建不起来。

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

重 点

这两句错误信息只差一个词,NEW 和 OLD 各自认哪一半,一次就记住了。

想一想

那 UPDATE 触发器里两个都能写吗?

05
第 16 章 · 上机一

1362:来不及了

数据已经写进去了,这时候改 NEW 没有意义。

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

重 点

想改值就得 BEFORE,AFTER 里 NEW 只能读不能写。

打个比方

菜端上桌了再说少放盐,厨房也没办法。

知道更多

六种组合里只有三种 BEFORE 改得了 NEW,AFTER 那三种一律只读。

06
第 16 章 · 上机一

1064:老问题又来一遍

触发器体里第一个分号就把它拦腰截断。

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

重 点

第 15 章撞过一次,这一章还会撞,凡是交出一段代码都要先改定界符。

想一想

课件第 50 页那段代码也没改定界符,照抄会怎样?

第 16 章 · 上机一

自己写一个:负分改成 0

把成绩小于 0 的一律拨回 0,其余按原值插入。

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

重 点

开头那句 DROP TRIGGER IF EXISTS 让这一题能重复跑,不用先按重置环境。

知道更多

触发器不能 ALTER,要改只能先删再建,所以这句几乎每次都要写。

想一想

把 IF 换成 SET NEW.score = ABS(NEW.score) 呢?

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