Mysql系列课程--第七章 触发器和存储过程

来源:互联网 发布:java观察者模式实例 编辑:程序博客网 时间:2024/06/08 08:59

Mysql第六章触发器和存储过程

一.触发器
1.被动,不是由用户执行,而是满足条件后自动执行一系列sql
2.触发条件: insert ,update ,delete
3.触发时间可以分为:after , before

创建触发器(student表插入一条数据触发在student_bak表里备份一条数据):

delimiter //create trigger tr_stu1after insert on studentfor each rowbegininsert student_bak(s_no,s_name,c_no,c_name,score) values(new.s_no,new.s_name,new.c_no,new.c_name,new.score);end //

创建触发器(student表删除数据触发在student_bak表里备份数据):

delimiter EOFcreate trigger tr_stu_del_bakafter delete on studentfor each rowbegininsert student_bak(s_no,s_name,c_no,c_name,score) values(old.s_no,old.s_name,old.c_no,old.c_name,old.score);end EOF

delimiter //:定义结束标识符为//,碰到//代表结束,也可以定义成其他的
new :代表新插入的数据
old :代表删除的旧数据
删除触发器:

drop  trigger  tr_stu_del_bak;

二.面试题

这里写图片描述
数据:

create table a (aid int primary key,create_date datetime,num int,money int,status varchar(1) default 'N');insert into a values(1,sysdate(),3,900,'N');insert into a values(2,sysdate(),2,900,'N');insert into a values(3,sysdate(),5,1000,'N');create table b (bid int,aid int,create_date datetime,money int);

答案:

delimiter //create trigger upa_addbafter update on afor each rowbegindeclare status_new varchar(1);declare num int;set status_new = (select status from a where aid = old.aid);set num = 0;if status_new = 'Y' thenwhile num < old.num do    insert b values(num+1,old.aid,date_add(old.create_date,interval num     month),old.money/old.num);    set num = num +1;end while;end if;end//

三.存储过程
1.为了处理业务逻辑,相当于JAVA里的方法
2.循环判断加上一堆sql语句

3.有参存储过程(求两个参数和):

delimiter //create procedure pro_sum(i int ,j int)begin   select i+j '求和';end //

调用存储过程:call pro_sum(7,8);

4.无参存储过程:

delimiter //create procedure pro_sum()begindeclare i int;declare j int;set i = 5;set j = 6;select i+j '求和';end //

调用存储过程:call pro_sum();

5.插入5000条数据

delimiter //create procedure auto_addStu(num int)begin declare i int;set i = 0;while i < num doinsert student(s_no,s_name,s_age) values(i+1,concat('Zara',i+1),round(rand()*20+10));set i = i + 1 ;end while;end//

调用存储过程:call auto_addStu(5000);

四.事务
1.要不都执行,要么都不执行。
2.要么提交commit,要么回滚rollback。

开启事务:

start transaction;insert t_user(name,sex,age,buildtime) values('张三','男',18,20171202125339);insert t_user(name,sex,age,buildtime) values('张三','男',18,20171202125339);insert t_user(name,sex,age,buildtime) values('张三','男',18,20171202125339);insert t_user(name,sex,age,buildtime) values('张三','男',18,20171202125331);rollback;

详细课程查询:
Mysql系列课程–第一章 Sql分类 常用命令
Mysql系列课程–第二章 约束 自增主键
Mysql系列课程–第三章 建表 插数据
Mysql系列课程–第四章 备份 普通查询
Mysql系列课程–第五章 高级查询 表连接 子查询 case when
Mysql系列课程–第六章 索引和视图
Mysql系列课程–第七章 触发器和存储过程
Mysql系列课程–第八章 sql精选35道题