第 16 章 · 第三节
日志表五列
学号、姓名、旧专业、新专业、修改时间。

重 点
omaj 存 OLD.maj,nmaj 存 NEW.maj,名字里的 o 和 n 就是这么来的。
知道更多
日志表要先建好,表不在的话触发器建得上,改数据时才报 1146。
打个比方
账本得先摆在桌上,记账的人才落得下笔。
想一想
表还没建就先建触发器,会在哪一步报错?
学号、姓名、旧专业、新专业、修改时间。

omaj 存 OLD.maj,nmaj 存 NEW.maj,名字里的 o 和 n 就是这么来的。
日志表要先建好,表不在的话触发器建得上,改数据时才报 1146。
账本得先摆在桌上,记账的人才落得下笔。
表还没建就先建触发器,会在哪一步报错?
AFTER UPDATE 里往日志表插一行,OLD 和 NEW 都用上。

| sno | sn | omaj | nmaj | udate |
|---|---|---|---|---|
| s2 | 苏乐 | 信息 | 计算机 | 16:18:53 |
记日志用 AFTER:数据已经改成事实了,记下来才作数。
旧专业信息,新专业计算机,时间是 now() 现算的。

同一张表上 OLD 和 NEW 的列名一样,靠前缀分清是哪一份。
两个都合法,写反了库也照收,日志从此全是错的,这种错最难查。
这条日志是谁改的,表里看得出来吗?
一条语句命中四行,触发器就跑四遍。

| 命中几行 | 触发器跑几遍 | 日志表多几行 |
|---|
Rows matched 是几,日志表就多几行,不是一句一次。
命中却一个字没改,触发器照样跑,这一条课件没说。
WHERE 一行都没命中呢?
BEFORE DELETE 先清子表,父行才删得动。

必须是 BEFORE:sc 还引着 s1,先删子表这一关才过得去。
改成 AFTER DELETE 会卡在哪一步?