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

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

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

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

delimiter //
create trigger tr_stu1
after insert on student
for each row
begin
insert 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 EOF
create trigger tr_stu_del_bak
after delete on student
for each row
begin
insert 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_addb
after update on a
for each row
begin
declare 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' then
while 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()
begin
declare 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 do
insert 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道题

猜你喜欢

转载自blog.csdn.net/u012843355/article/details/78873988