MySQL数据库学习笔记(九)实验课六之触发器和存储过程

没想到这就是最后一次实验了。

一点知识:

道具 – delimiter / DELIMITER

这是用于指定语句分隔符的特殊命令
默认情况下,MySQL使用分号(;)作为语句的结束符。然而,当我们需要定义存储过程、触发器或函数等包含多条SQL语句的对象时,分号会被误认为语句结束,导致出现语法错误。
为了解决这个问题,可以使用DELIMITER命令将分号(;)替换为其他字符作为语句分隔符,以便在创建存储过程、触发器或函数等对象时,正确处理多条SQL语句。
用法:

DELIMITER //
内容
DELIMITER ;

主动技能 – 存储过程

因为要调用,所以类似于英雄主动技能
创建存储过程:

create procedure 名字()
begin
	具体内容
end;

有参数:

create procedure 名字(
in 参数1 int,
in 参数2 int
)
begin
	具体内容
end;

删除存储过程:

drop procedure 名字;

调用存储过程

call 名字

被动技能 – 触发器

不需要调用,类似于被动技能
推荐文章:文章
不得不说,你如果想要狠狠搞清楚触发器怎么用的话,我还是推荐你看推荐文章
创建触发器:

create trigger 名字
前/后 触发方式 表名
for each row
begin
··········
end;

删除触发器:

drop trigger 名字;

实验:

实验数据:

student表:
MySQL数据库学习笔记(九)实验课六之触发器和存储过程_第1张图片
student1表:
MySQL数据库学习笔记(九)实验课六之触发器和存储过程_第2张图片
course表:
MySQL数据库学习笔记(九)实验课六之触发器和存储过程_第3张图片
sc表:
MySQL数据库学习笔记(九)实验课六之触发器和存储过程_第4张图片
teacher表:
MySQL数据库学习笔记(九)实验课六之触发器和存储过程_第5张图片

实验开始:

1,创建存储过程,使用 student 表中的学生人数来初始化一个局部变量, 并调用这个存储过程:

DELIMITER //
create procedure GetStudentCount()
begin
    declare studentCount int;	#定义局部变量

    select count(*) into studentCount from student; #数行数
    # select count(*) into a 的意思是将count(*)的值赋给a

    select studentCount AS StudentCount;

end //
DELIMITER ;

调用:

call GetStudentCount();

2,创建存储过程,比较两学生的年龄,若前者比后者大就输出 0,否则输 出 1:

delimiter //
create procedure CompareStudentAge(
    in student1_num int,
    in student2_num int
)	#我使用的参数是学生编号,你也可以尝试不同的写法
begin
    declare result int;
    declare age1 int;
    declare age2 int;
    select Sage into age1 from student where Sno = student1_num;
    select Sage into age2 from student where Sno = student2_num; #进行查询操作

    if age1 > age2 then
        set result = 1;
    else
        set result = 0;
    end if;

    select result as CompareResult;

end //
delimiter ;

调用:

call CompareStudentAge(2008001,2008003);

3,创建触发器,在 student 表中删除学生信息的同时将 sc 表中该学生的 选课信息删除,以确保数据的完整性:

delimiter //
create trigger delete_student_sc
before delete on student
for each row
begin
    delete from sc where Sno = OLD.Sno;
end;
delimiter ;

触发:

delete from student where Sno = 2008002;

4,假设 student1 表和 student 表的结构和内容都相同,在 student 上创建 一个触发器,如果添加一个学生的信息,该信息也会被添加到 student1 表中:

delimiter //
create trigger add_student_st1
after insert on student
for each row
begin
    insert into student1 (Sno, Sname, Ssex, Sage, Sdept)
    VALUES (new.Sno, new.Sname, new.Ssex, new.Sage, new.Sdept);
end;
delimiter ;

触发:

insert into student(sno, sname, ssex, sage, sdept) VALUES ('2008006','杨过','男','19','IS');

5,定义一个 BEFORE 行级触发器,为 teacher 表定义完整性规则“插入教 授的信息时,工资不得低于 4000 元,如果低于 4000 元,则自动改为 4000 元”:

delimiter //
create trigger teacher_income
before insert on teacher
for each row
begin
    if new.Income < 4000 then
        set new.Income = 4000;
    end if;
end;
delimiter ;

6,删除 teacher 表上的触发器 teacher_Income :

drop trigger teacher_income;

结束~

你可能感兴趣的:(数据库学习笔记,数据库,mysql,学习)