一. 触发器
1.1什么是触发器
简单的说触发器就是某个表发生一个事件(增删改操作),然后自动的执行预先编译好的SQL语句,执行相关操作。触发器事件跟触发器中的SQL语句是原子性的(要么同时执行,要么同时不执行),这样保证了数据的完整性。
1.2触发器的语法
delimiter $ -- 表示语句的结束标志
create trigger 触发器名称 before/after insert/update/delete on 表名 for each row -- 每一行变动触发
begin
SQL语句
end$
delimiter ; -- 此处必须有空格
上面的语法意思就是在执行表的增删改之前或之后,完成对应事件的触发。
1.3例子说明
首先创建商品跟订单两张表
查看表结构
添加数据
编写触发器
实现订单
问题:如果订单的数量大于商品的数量,则有问题,修改触发器
如果是订单取消,则我们对应的商品的数量则应该返还。
修改触发器
执行订单取消后
1.4相关说明
delimiter $ : 这个改变输入的结束符,我们触发器内部SQL开始于begin,结束于end,这中间可能有多条SQL语句,我们不能在遇到";"就代表结束,故相当于重新定义结束符$。最后一行"delimiter ;"注意有空格,这里相当于告诉mysql,结束符还是用“;”。
new:当触发器添加或更新事件时,代表对应被操作的记录。我们在产生订单时,商品数量 = 当前商品数量 - 订单数量。获取订单数就是用new来表示。
old:当触发器删除或更新事件时,代表对应的被操作的记录。订单取消,商品数量 = 当前商品数量 + 订单数量。订单数就是被取消(delete)的,用old表示。
二.存储过程
2.1 函数
函数分为内部函数,例如聚合函数,SUM,AVG等等,还有自定义的函数。
创建函数类似于触发器,不过关键字变为了function,同时必须有返回值。
set定义的是全局变量,我们可以直接查询到,declare定义的为局部变量,无法外部访问
2.2存储过程
存储过程类似于函数,不过存储过程没有返回值,而且调用存储过程是用call
三.触发器与存储过程的比较
触发器是事件发生时自动发生,不需要手动调用,而存储过程是需要手动调用。一般开发中,如果如果事件SQL比较复杂,不推荐用触发器,因为会导致后期维护比较困难。而存储过程一般用来实现 SQL语句比较复杂的功能。存储过程类似于java中的方法,供其他方法中调用,我们可以在后台代码直接调用存储过程。