先给结论,trigger 可以看成是 给操作表的 update 语句加上一个小尾巴,这个小尾巴不捣乱,update 语句就能顺利的更改表,如果这个小尾巴想破环,那么 update 整条语句就不能正确执行,导致更新表失败。
解释如下,
当给一个表,加了 update trigger,这是前提,
当对一个表的 update,最终是否能成功更新表,也就是将更新的结果写进表中,要看这步操作触发的 trigger 是否同意,如果,trigger 允许,那么 update 就可以成功把结果写进表中达到更新的目的,但是,如果 , trigger 不同意,那么即使 update 语句本身没有问题其自身执行也很顺利,也不能把结果写入表中。
在 trigger 中,
trigger 的语句 after update 这一步的结果是 ,
update 命令 顺利执行了,但表还没有被更改,记录还没有改写,
接下来,还要看trigger 是否同意 update 去修改表,
按正常的情况,表就被更新了,
但,这是在 trigger 中,我们可以 ,让它新,也可以,不让它更新,
这取决于我们对 trigger 的设置,
能这样的原因,是,trigger 会 on 到一个 表上,关联 update 操作
当,对这个表 进行 update 操作的时候,会触发 trigger ,
请注意,这时候,update 虽然 已经执行了,但是,还没有能真正去 改变表,
因为,它 触发了 trigger,还要等 trigger 的意见。
我做了个实验,给我的感觉是,一旦给 表 建立了一个 由 update 触发的 trigger ,
当对表执行 update 时,这条 update 语句就加上了一个小尾巴,
如果,这个小尾巴 报错,那么这条 update 整条语句就会出错,导致 update 没有执行成功,
举个最简单的例子,
update tablename set id=1 where id=1;
但是如果,我们给这条语句加上一个小尾巴,比如 几个空格,如下:
update tablename set id=1 where id=1 ;
并不会影响 update 的正确执行,
但,如果,我们给 加上个 星号 什么的,如下:
update tablename set id=1 where id=1 *;
那么这条语句,必定报错,从而,执行失败,必须等你我们将 星号这个小尾巴去掉,语句才能正常执行,
trigger 就是起到这个小尾巴的作用,
产生这篇文章的原因是:
我在做实验的时候,遇到了
after update on tablename
这条语句,
我始终想不明白,update 都已经 先于 trigger 执行了,即便 trigger 不同意,又能怎么样呢,你毕竟是,after update,在update 执行之后 才出现的, 所以,update 都已经执行了,结果都写到表里了,你trigger不同意又能怎样呢!
但,我还是年轻啊,trigger 可没有这么简单,
它把自己和 update 捆绑到一起了,
相当于 给 update 语句 加了个小尾巴,
trigger 想让 update 执行成功,小尾巴就是 空格,
trigger 不想让 update 执行成功,小尾巴就是 *星号,
上例子,
我有一个 trigger 叫 limitprice关于 表 g 的 update 操作,
作用是,当要 update 表 g 的时候,如果新值 比 原值 大 1/5 以上,就不能更改表,
展现一下 表 g,
毛笔,id=1,price=5,
5的 1/5 是 1,
所以,大于6 的新值都不能写进表里,
做2个验证,
可以看出来,trigger 就是通过,把自己和 update 语句 绑定到一起,来达到 控制 update 语句是否可以成功执行的目的,
这里的,after ,虽然是update 先于 trigger 执行 ,但update 语句 成不成功 还得看 trigger。
不知道,为什么,我用的这个版本,before 和 after 的 trigger 效果一样,
先,写到这里吧,可能是我的MySQL 出现了问题,
按道理说,before 和 after 应该有区别才对。
January the 20th 2022 Friday