mysql中触发器与存储过程

一. 触发器

1.1什么是触发器

    简单的说触发器就是某个表发生一个事件(增删改操作),然后自动的执行预先编译好的SQL语句,执行相关操作。触发器事件跟触发器中的SQL语句是原子性的(要么同时执行,要么同时不执行),这样保证了数据的完整性。

1.2触发器的语法

    delimiter $       -- 表示语句的结束标志

    create trigger 触发器名称 before/after  insert/update/delete on 表名 for each row -- 每一行变动触发

    begin

        SQL语句

    end$

    delimiter   ;  -- 此处必须有空格

上面的语法意思就是在执行表的增删改之前或之后,完成对应事件的触发。

1.3例子说明

首先创建商品跟订单两张表

mysql中触发器与存储过程_第1张图片

查看表结构

mysql中触发器与存储过程_第2张图片

添加数据

mysql中触发器与存储过程_第3张图片

编写触发器

mysql中触发器与存储过程_第4张图片

实现订单

mysql中触发器与存储过程_第5张图片

问题:如果订单的数量大于商品的数量,则有问题,修改触发器

mysql中触发器与存储过程_第6张图片

mysql中触发器与存储过程_第7张图片

如果是订单取消,则我们对应的商品的数量则应该返还。

修改触发器

mysql中触发器与存储过程_第8张图片

执行订单取消后

mysql中触发器与存储过程_第9张图片

1.4相关说明

delimiter $ : 这个改变输入的结束符,我们触发器内部SQL开始于begin,结束于end,这中间可能有多条SQL语句,我们不能在遇到";"就代表结束,故相当于重新定义结束符$。最后一行"delimiter   ;"注意有空格,这里相当于告诉mysql,结束符还是用“;”。

new:当触发器添加或更新事件时,代表对应被操作的记录。我们在产生订单时,商品数量 = 当前商品数量 - 订单数量。获取订单数就是用new来表示。

old:当触发器删除或更新事件时,代表对应的被操作的记录。订单取消,商品数量 = 当前商品数量 + 订单数量。订单数就是被取消(delete)的,用old表示。

二.存储过程

2.1 函数

函数分为内部函数,例如聚合函数,SUM,AVG等等,还有自定义的函数。

mysql中触发器与存储过程_第10张图片

创建函数类似于触发器,不过关键字变为了function,同时必须有返回值。

set定义的是全局变量,我们可以直接查询到,declare定义的为局部变量,无法外部访问

mysql中触发器与存储过程_第11张图片

2.2存储过程

存储过程类似于函数,不过存储过程没有返回值,而且调用存储过程是用call

mysql中触发器与存储过程_第12张图片

三.触发器与存储过程的比较

触发器是事件发生时自动发生,不需要手动调用,而存储过程是需要手动调用。一般开发中,如果如果事件SQL比较复杂,不推荐用触发器,因为会导致后期维护比较困难。而存储过程一般用来实现 SQL语句比较复杂的功能。存储过程类似于java中的方法,供其他方法中调用,我们可以在后台代码直接调用存储过程。

你可能感兴趣的:(MySQL基础应用)