一.触发器 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; #查看返回值