例题 2 的第一步
五列:学号、姓名、旧专业、新专业、修改时间。
重 点
omaj 存 OLD.maj,nmaj 存 NEW.maj,名字里的 o 和 n 就是这么来的。
想一想
表还没建就先建触发器,会在哪一步报错?
五列:学号、姓名、旧专业、新专业、修改时间。
omaj 存 OLD.maj,nmaj 存 NEW.maj,名字里的 o 和 n 就是这么来的。
表还没建就先建触发器,会在哪一步报错?
OLD 和 NEW 同时用上,这是 UPDATE 触发器的典型样子。
记日志用 AFTER:数据已经是事实了,记下来才作数。
五个值:前三个来自 OLD,第四个来自 NEW,最后一个是 now() 现算的。
一条 UPDATE 命中四行,日志一下多四行。
回显说 Rows matched: 4,日志表就多四行,一行一次,不是一句一次。
把 WHERE 去掉,八行全命中,日志一下多八行,写触发器前先想清这一点。
要是 WHERE 一行都没命中呢?
新值和旧值一模一样,Changed 是 0,日志却还是多一条。
触发器认的是「命中」,不是「改动」。命中就点火,改没改它不管。
Rows matched 是 1,Changed 是 0,日志却多一条,三个数字要分开看。
那日志表里这一条记的旧专业和新专业长什么样?
BEFORE DELETE 先把子表清掉,父行才删得动。
必须是 BEFORE:sc 还引着 s1,先删子表这一关才过得去。
顺序是先子后父:sc 里那两行先删掉,s1 才过得了外码这一关。
改成 AFTER DELETE 会在哪一步卡住?
触发器里再去改触发它的那张表,真机直接拦下。
建的时候不报,等真去插一行才报 1442,这个坑埋得比较深。
想在同一张表上改值,用 BEFORE 里的 SET NEW.列,不要再写一句 INSERT。
改成往另一张表插,还会报吗?
校验、记日志、级联,一次把三种时机都用上。
180 被 BEFORE 拨回 100,改成 88 时 AFTER 记下 100 到 88 这一笔。
日志里 old_s 记的是 180 还是 100?