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 过程名称;