mysql的触发器和存储过程

触发器:

什么事MySQL触发器:

mysql触发器是与表关联的数据库存储程序,用于响应关联表中发生的事件(例如插入,更新或删除)而自动调用。即当触发器所在表上出现指定事件时,将调用该对象,也就是表的操作事件触发表上的触发器的执行。

create trigger trigger_name
trigger_time
trigger_event ON table_name for each roe
trigger_stmt

trigger_name:触发器的名字,可以自己设置

trigger_time:触发时机,也就是在多长时间内会发生这件事情,一般取值为befor和after

trigger_event:触发事件,当到这里的时候希望他会发生一件什么事情,一般取值为insert(增加)、update(修改)、delete(删除)。

table_name:建立触发器的表名,即你想在那张表中设置这个触发器。

trigger_stmt:触发器程序体,这里可以用sql语句来写或者是用begin和end包含的多条语句。

  • trigger_event中除了对增加、删除、修改的基本操作外,还定义了LOAD DATA(导入数据库语句)和REPLACE(替换语句),他们俩也能引起上述6种类型的触发器触发
  • LOAD DATE型触发器:将一个文件装入到一个数据表中。
  • replace型触发器和insert语句一样,但是他俩的区别是在表中有主键或者unique索引时,primary key或unique索引一致,会先删掉原来的数据,然后再增加一条新数据。
  • insert型触发器:插入某一行的时候激活触发器。
  • update型触发器:修改某一行语句的时候激活触发器。
  • delete型触发器:删除否一行时候激活触发器。

 BEGIN...END 

在mysql中的语法是:

BEGIN
[statement_list]
END

statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号(;)来结尾。
而在MySQL中,分号是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL可以开始执行了。因此,解释器遇到statement_list 中的分号后就开始执行,然后会报出错误,因为没有找到和 BEGIN 匹配的 END。

这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思),它是一条命令,不需要语句结束标识,语法为:

delimiter [一个新的符号]
例如:
delimiter $

一个完整的创建触发器示例:
假设系统中有两个表:
班级表 class(班级号 classID, 班内学生数 stuCount)
学生表 student(学号 stuID, 所属班级号 classID)
要创建触发器来使班级表中的班内学生数随着学生的添加自动更新,代码如下:

 查看触发器:

和查看数据库和表一样,语法如下:

show trigger [from schema_name]

删除触发器:

和删数据库和表一样,语法如下:

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

存储过程:

存储过程:是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。

存储过程是为了完成特定功能的sql语句,经过编译创建并且保存在数据库中,用户可以通过指定存储过程的名字给定定参数来调用执行。

存储过程的创建和调用:

创建存储过程:

create procedure mypro(in a int,in b int,out sum int) 
begin 
set sum = a+b; 
end;

mypro:用来定义过程的名称

(in a int,in b int,out sum int)表示过程的参数,其中 in 表示输入参数,out 表示输出参数。

begin和end与触发器的表示意义是相同的,都表示主体的开始和结束。

call:调用过程

@s:接收过程输出参数的变量

create function 存储函数名(参数):创建存储过程体

存储过程的参数: 

MySQL存储过程的参数用在存储过程的定义,共有三种参数类型,IN,OUT,INOUT,形式如:

create porcedure 存储过程名([[IN|OUT|INOUT]参数名 数据类型...])
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)

 变量:

因为mysql中的存储过程类似Java中的方式,所以在存储过程中同样也可以使用变量。 java 中的局部变量作用域是变量所在的方法,而 MySQL 中的局部变量作用域是所在的存储过程。

变量的定义:

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
  • declare用于声明变量;

  • variable_name表示变量名称;

  • datatype为 MySQL 的数据类型;

  • default用于声明默认值;

 变量的赋值:

SET 变量名 = 表达式值 [,variable_name = expression ...]

控制语句:

if条件语句:

if语句中包含多个条件判断,根据结果为TRUE、FLASE执行语句,与编程语句中的if、else if、else语法类似

while循环语句:

while 条件 do

        --循环体

endwhile

repeat循环语句:

repeat语句用法和Java中的do....while语句类似,都是先执行循环,在判断条件,区别是repeat表达式值为flase时候才执行循环操作,直到表达式为TRUE停止。

repeat
    --循环体
until 循环条件  
end repeat;

 loop循环语句:

 loop 循环不需要初始条件,这点和 while 循环相似,同时和 repeat 循环一样不需要结束条件, leave 语句的意义是离开循环。

存储过程的管理

存储过程的管理包括了:显示过程、显示过程源码、删除过程。

显示存储过程:

show procedoue status;
show procedoue status where db ='shooldb';----显示特定数据库的存储过程

删除存储过程:

drop PROCEDURE 过程名称;

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值