40 触发器 事务 储存过程

一.触发器 trigger


对用户某张表的数据进行 增删改 操作时的前后行为。

1.创建触发器:(before/after insert/delete on 表名 for each row)

格式:
create trigger 触发器名字 before insert on 表名 for each row
begin
..... 这里面写触发器要的的mysql事情
end


例:
create table cmd(id int primary key auto_increment,
use char(32),priv char(10),cmd char(64),
sub_time datetime,success enum("yes","no"));

crate table errlog(id int primary key auto_increment,
err_cmd char(64),err_time datatime);


delimiter //
create trigger tri_cmd after insert on table cmd for each row
begin
if new.success="no" then
insert into errlog(err_cmd,err_time) values(new.cmd,new.sub_time);
end if;
end //
delimiter ;

2.删除触发器: drop trigger 触发器的名字

 

二. 事务 transaction

要么同时成功要么同时失败

start transaction ;
update user set balance =900 where name="wsb";
update user set balance =1010 where name="chao";
update user set balance=1090 where name="ysb";
rollback;#回滚
commit; #提交才能生效

 

三.储存过程

 

1.创建简单储存过程
delimiter //
create procedure p()
begin
select * from blog;
insert into blog(name,sub_time) values("xx",now());
end //
delimiter;

 

2. in传参 或out传参 或inout
create procedure p(
in n1 int,
out n2 int); #该参数主要是通过存储过程能得到一个状态参数

3.调用 call p()

4. out 传参时,set @res=3 此参数的传入值做占位用, 存储过程很会改变该参数值,
得到返回值,返回值需要用 select @res;来得到 ,外部调用的时候 call p(@res)。

5.删除储存过程 drop procedure p;


四. 事务和存储过程的结合


delimiter //;
create procedure p1(out res int);
begin
declare exit handler for sqlexception
begin
--error #对错误的处理
set res =1; #将 out 返回值该为1,1表示出错
rollback;#回滚事务
end;

declare exit handler for sqlwarning
begin
--warning #声明出现警告信息之后的操作
set res=2;
rollback;
end;

start transaction;
insert into blog(name,sub_time) values("yyy",now());
commit;

--success
set res=0; #0 代表成功

end //
delimiter ;

set @res=123;
call p1(@res); #调用存储过程
select @res; #查看返回值

posted @ 2018-12-14 17:10  冰底熊  阅读(157)  评论(0编辑  收藏  举报