mysql 触发器,存储过程

来源:互联网 发布:linux给其他用户权限 编辑:程序博客网 时间:2024/05/29 15:54

触发器:

触发器是数据库系统中的一种机制,可以根据某一张表的增、删、改操作时作出一些特定的功能处理。

触发器创建在表的基础上,类型有三种,增、删、改,也就是说,一个表最多只能创建三个触发器。

同时,触发器是可以联动的。比如说销售记录插入一条销售信息,则销售记录表的insert触发器触发,针对商品表的库存进行修改。如果商品表创建了update触发器,则商品表的update触发器也会紧跟着触发。


语法 :create trigger  触发器名  after ,before    insert/update/delete on 表名 (当某张表执行指定修改时 调用触发器)

              for each row

              begin

                       //业务处理

                      //业务处理

              end;

before:(insert、update)可以对new进行修改,after不能对new进行修改,两者都不能修改old数据。

在触发中new表示新添加的数据行   old 表示删除的数据行。

Insert 时只有new 数据行

Delete时只有 old 数据行

Update时 两个数据行都有,更改数据时,先把这一行数据删除,数据行存在old里面,然后再插入修改后的数据行,则插入的数据行保存在new 里面。

 

案例一:insert触发器

/*在销售表中添加insert触发器,触发时修改商品表的库存*/

DELIMITER$$

createtrigger t_orderList AFTER insert on orderList

for each row

begin

    /*取商品编号 及 数量  然后根据商品编号把商品表的库存减少,减少数量*/

    update goods set kuchun = kuchun-new.numwhere goods.id = new.gid;

end$$;

 

案例二:delete触发器

DELIMITER$$

createtrigger t_student AFTER delete on student

for each row

begin

    /*取删除的学员信息,插入到毕业学员信息表中  old行保存的是删除的学员信息*/

    insert into biyeiStudentvalues(old.studentno,old.name,old.sex,old.phone,old.birthday,

                                   old.address,old.email);

end$$;

 

案例三:update 触发器 当更改了库存后,触发,重新计算商品的总价值。

delimiter $$

createtrigger t_goods before update on goods

for each row

begin

   /*判断是哪一列进行了修改*/

   if old.kuchun != new.kuchun then

      /*因为是同一个表,所以只要设置新行里面值就可以。*/

      set new.totalPrice =new.kuchun*new.inPrice;   

   end if;

end;

$$;


存储过程:

储过程类似于Java中的方法,把一些复杂的业务进行封装,并进行了预编译,以后可以调用过程名,就可以执行过程中的业务代码,

就像Java中的方法调用。过程可以给参数。

优点:

速度快、安全、减少网络流量

执行速度更快,性能高

允许模块化程序设计,重用性强。

提高系统安全性

减少网络流通量

业务员复杂时,减少工作量。

缺点:

工作量加大,有时调用不方便。

在小型程序中优势不明显。

在运维中,如果要更换数据库,有点麻烦

语法:

delimiter $$

create procedure 存储过程名(参数1,参数2)

begin

sql语句;

end $$

存储过程参数

——和java语言的方法一样,参数可选

——参数分为输入参数,输出参数,及输入输出参数

——默认输入参数


/*创建存储过程*/
delimiter $$
create procedure p_student()
begin
select  * from student where studentno in
(select studentno from result where studentResult<60 and subjectno in 
(select subjectno from subject where subjectName='php') 
);
end $$;

/*调用存储过程*/

call p_student();


*创建带参数的存储过程,根据输入的科目名称进行查询相关科目未及格学院信息*/
delimiter $$
create procedure p_stdent2(sn varchar(20))
begin
select  * from student where studentno in
(select studentno from result where studentResult<60 and subjectno in 
(select subjectno from subject where subjectName= sn) 
);
end $$;


/*调用存储过程,传一个输入参数*/
set @sn = 'html';
call p_stdent2(@sn);


/*带输出参数,统计参加java 考试的学院人数及未及格人数*/
delimiter$$
create procedure p_result(out num1 int,out num2 int)
begin 
select count(*) into num1 from result where subjectno=1;
select count(*) into num2 from result where subjectno=1 and studentResult<60;
end$$;

set @n1 =0;
set @n2=0;
call p_result(@n1,@n2);
select @n1 as '参考人数',@n2 as '未通过人数';

0 0
原创粉丝点击