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$
参考: