sql触发器,if语句无法进行条件筛选

c_total 为班级人数

如图所示代码,创建触发器之后,如果对student表进行更新,

假设将 a号班级的学生修改为了b号班级

a号班级人数会-2,而b号班级人数会+2

显然这三个if同时最多只能有一个为真,而它们为什么全部执行了

你说的全都执行是什么意思,全都执行可能并不是全都执行了,而是每一次都执行第一个if语句。班级人数在数据库的表中,肯定是非空的呀,你要判断它存不存在,用exists语句判断,不是null,判断是否存在,不是判断是否非空。

打倒触发器!

这么完全应当放到业务逻辑里,而不是触发器。滥用触发器,导致数据库过于复杂,应用程序业务逻辑不好维护业务逻辑,会有意想不到的惊讶。

问题找到了,原因是在student表上还有两个触发器一个是在删除学生时对应班级人数-1的,另一个是在插入学生时对应班级人数+1,

所以即使我的触发器修改为这样,在更新数据时还是会触发上述所说的触发器,而非if语句的问题。

解决办法是将这三个触发器合并为一个,如下图

在合并三个触发器之后,我们的插入,删除操作依旧会正确的触发触发器,更新操作不再会与上面两个触发器产生错误。会正常进行一个+1而另一个-1的操作。而不是使用三个触发器,这样在进行更新操作的时候,这三个触发器都会被触发,从而导致一个+2另一个-2