ITPub博客

首页 > 数据库 > MySQL > Mysql触发器与存储过程

Mysql触发器与存储过程

MySQL 作者:snowman11 时间:2014-01-02 23:29:21 0 删除 编辑
Mysql触发器  
语法:CREATE TRIGGER <触发器名称> <--  { BEFORE | AFTER }   { INSERT | UPDATE | DELETE }  ON <表名称>  FOR EACH ROW   <触发器SQL语句>

1.命名规则:触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.  
2.触发时间:触发器有执行的时间设置:可以设置为事件发生前或后。 
3.事件:同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。  
5.语句:触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句,  包括复合语句,但是这里的语句受的限制和函数的一样。  
 6. 查看创建的触发器 show triggers; 
 7. 删除一个触发器  drop trigger  trigger_name;

模拟下单和删除订单时商品库存的改变 

1、 创建两张表,分别为商品库存表sku和订单商品表order_goods 
create table order_goods( 
id int auto_increment primary key, 
goods_id int not null,
goods_name varchar(200) not null,
goods_num int not null
) ;
create table sku( 
 id int auto_increment primary key,
 g_id int not null, 
sku_num int not null 
 )  
2、 创建当订单创建时,相应商品库存减少的触发器 
 Delimiter $  
Cretate trigger buy  After insert on order_goods For each row Begin  Update sku set sku_num=sku_num-new.goods_num where g_id=new.goods_id; End$  Delimiter 
3、 创建当订单被删除的时候,相应商品库存增加的触发器 
 Delimiter $  Create trigger cancle  After delete on order_goods Fro each row Begin  Update sku set sku_num = sku_num + old.goods_num where g_id=old.goods_id; End$  Delimiter  

Mysql存储过程  
1、 创建存储过程语法:  
Create procedure procedure_name Begin   SQL block End  修改存储过程语法:  ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]   characteristic:  { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }   | SQL SECURITY { DEFINER | INVOKER }   | COMMENT 'string'这个语句可以被用来改变一个存储程序或函数的特征。
2、 删除存储过程语法 
Drop procedure if exists procedure_name 
3、 查看所有的存储过程名称 Show procedure status; 
4、 调用存储过程语法: 
Call procedure_name; 
5、 在存储过程中使用declare来生命一个局部变量,使用set来对变量赋值 
6、 存储过程中的in out inout 
MySQL 存储过程“in” 参数:跟 C 语言的函数参数的值传递类似, MySQL 存储过程内部可能会修改 
此参数,但对in 类型参数的修改,对调用者(caller)来说是不可见的(not visible)。  
MySQL 存储过程“out” 参数:从存储过程内部传值给调用者。在存储过程内部,该参数初始值为null, 无论调用者是否给存储过程参数设置值  
MySQL 存储过程inout 参数跟out 类似,都可以从存储过程内部传值给调用者。不同的是:调用者还 
可以通过inout 参数传递值给存储过程。

总结:  如果仅仅想把数据传给MySQL 存储过程,那就使用“in” 类型参数;如果仅仅从MySQL 存储过程返回  值,那就使用“out” 类型参数;如果需要把数据传给MySQL 存储过程,还要经过一些计算后再传回给我  们,此时,要使用“inout” 类型参数.

Mysql存储过程中的三种循环 
 在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环    Create table test(id int not null,name varchar(50) not null);创建一个测试数据库  
1、while循环  delimiter $  
create procedure p() 
begin  declare i int; set i=0;  while i<5 do  insert into test(id,name) values(i,concat(‘test’,i)); set i=i+1; end while; end$  delimiter  
注:在WHILE循环中END WHILE后的面(;)不能少    执行创建好的存储过程   CALL P()
带有参数的存储过程  
create procedure p1(in n int) begin declare i int  set i=0;  while i<=n do  insert into test(id,name) values(i+3,concat(’测试’,i)); set i=i+1; end while; end$ 
2、REPEAT循环 
 Create procedure p2() Begin  Declare i int default 0;  Repeat   Insert into test(id,name) values(i,concat(‘REPEAT test’i)); Set i= i+1; Until I >= 5 End repeat; End$
3、LOOP循环 
Create procedure p3() Begin 
Declare I int default 0; Loop_lable: loop 
Insert into test(id,name) values(I,concat(‘LOOP test’,i)); Set i=i+1 If i>=5 then 
Leave loop_lable; End if; End loop;  End$

mysql存储过程中的条件判断 
 1、 IF THEN ELSE条件  
Create procedure con(in n int)  Begin  Declare I int default 0; Set i=n+1; If i=0 then  Insert into test(id,name) values(18,concat(‘你输入的是一个小于零的数字’,n)); Else  Insert into test(id,name) values(19,concat(‘你输入的是一个大于等于零的数字’,n)); End if; End$

2、 case条件语句 
create procedure case_test(n int) begin 
declare a int default 0; set a=n+1; 
case a 
when 1 then 
insert into test(id,name) values(a,concat(‘您输入的数字是:’,n)); when 2 then 
insert into test(id,name) values(a,concat(‘您输入的数字是:’,n)); else 
insert into test(id,name) values(a,concat(‘您输入的数字不在case范围内,该值是:’,n)); end case; end$
3、ITERATE在存储过程中的应用 
Create procedure p12()  Begin 
Declare I int default 0; Loop_label: loop If i=3 then Set i=i+1; 
Iterate loop_label; End if; 
Insert into test values(“ITERATE TEST”,i); Set i=i+1; If i>=5 then Leave loop_label; End if; End loop; End$ 
参考:
<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22050716/viewspace-1114577/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-07-06