MySQL高级篇——索引、视图、存储过程和函数、触发器的相关概念及操作(下)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL高级篇——索引、视图、存储过程和函数、触发器的相关概念及操作 (下)

文章目录:


3.4 删除存储过程

3.5 存储过程中常用语法

3.5.1 声明变量、变量赋值

3.5.2 if条件判断

3.5.3 传递参数

3.5.4 case结构

3.5.5 while循环

3.5.6 repeat循环

3.5.7 loop + leave循环

3.5.8 游标/光标

3.6 存储函数

4.触发器

4.1 创建触发器

4.1.1 insert型触发器

4.1.2 update型触发器

4.1.3 delete型触发器

4.2 查看触发器

4.3 删除触发器


3.4 删除存储过程

DROP PROCEDURE [IF EXISTS] sp_name;


3.5 存储过程中常用语法

3.5.1 声明变量、变量赋值

通过 DECLARE 可以定义一个局部变量,该变量的作用范围只能在 BEGIN…END 块中。

直接赋值使用 SET,可以赋常量或者赋表达式,具体语法如下:

 DECLARE var_name[,...] type [DEFAULT value] 
 SET var_name = expr [, var_name = expr] ...


也可以通过select ... into 方式进行赋值操作 :


3.5.2 if条件判断

if search_condition then statement_list
[elseif search_condition then statement_list] ...
[else statement_list]
end if;


3.5.3 传递参数

create procedure procedure_name([in/out/inout] 参数名  参数类型)
...
IN :  该参数可以作为输入,也就是需要调用方传入值 , 默认
OUT:  该参数作为输出,也就是该参数可以作为返回值
INOUT: 既可以作为输入参数,也可以作为输出参数


@description : 这种变量要在变量名称前面加上“@”符号,叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。

@@global.sort_buffer_size : 这种在变量前加上 "@@"符号, 叫做系统变量 


3.5.4 case结构

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE;


3.5.5 while循环

while search_condition do
    statement_list
end while;


3.5.6 repeat循环

有条件的循环控制语句, 当满足条件的时候退出循环while 是满足条件才执行,repeat 是满足条件就退出循环。

REPEAT
    statement_list
    UNTIL search_condition
END REPEAT;


3.5.7 loop + leave循环

LOOP实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用 LEAVE 语句实现,具体语法如下:

[begin_label:] LOOP
    statement_list
END LOOP [end_label]

如果不在 statement_list 中增加退出循环的语句,那么 LOOP 语句可以用来实现简单的死循环。


3.5.8 游标/光标

游标是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用光标对结果集进行循环的处理。光标的使用包括光标的声明、OPENFETCH CLOSE,其语法分别如下。

声明光标:

DECLARE cursor_name CURSOR FOR select_statement;

OPEN光标:

OPEN cursor_name;

FETCH光标:

FETCH cursor_name INTO var_name [, var_name] ...

CLOSE光标:

CLOSE cursor_name;

下面,为了演示光标的案例,先创建一张emp表。

create table emp(
    id int(11) not null auto_increment ,
    name varchar(50) not null comment '姓名',
    age int(11) comment '年龄',
    salary int(11) comment '薪水',
    primary key(`id`)
)engine=innodb default charset=utf8;
insert into emp(id,name,age,salary) 
values(null,'金毛狮王',55,3800),(null,'白眉鹰王',60,4000),(null,'青翼蝠王',38,2800),(null,'紫衫龙王',42,1800);

下面第一种方法是逐行获取光标,从中取出数据。


上面逐行获取的方法虽然可行,但是如果数据过多,则显得代码量较大、冗余度较高。

所以下面采用repeat循环的方法来获取光标。(截图中的Display请忽略,应该是粘贴的时候格式有点问题)


3.6 存储函数

CREATE FUNCTION function_name([param type ... ])
RETURNS type
BEGIN
...
END;

4.触发器


触发器是与表有关的数据库对象,指在insert/update/delete 之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操作


使用别名 OLD NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。


4.1 创建触发器

create trigger trigger_name
before/after insert/update/delete
on tbl_name
[ for each row ]  -- 行级触发器
begin
    trigger_stmt ;
end;

为了测试,这里首先创建一张emp_logs表,用来记录触发器相关的操作日志信息。

create table emp_logs(
    id int(11) not null auto_increment,
    operation varchar(20) not null comment '操作类型, insert/update/delete',
    operate_time datetime not null comment '操作时间',
    operate_id int(11) not null comment '操作表的ID',
    operate_params varchar(500) comment '操作参数',
    primary key(`id`)
)engine=innodb default charset=utf8;

4.1.1 insert型触发器

创建完insert型触发器之后,执行两条insert语句,即可在 emp_logs 表中看到信息。

create trigger emp_logs_insert_trigger
after insert 
on emp
for each row
begin
  insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
  values(null,'insert',now(),new.id,concat('插入后(id:',new.id,', name:',new.name,',
age:',new.age,', salary:',new.salary,')'));
end$
insert into emp(id,name,age,salary) values(null, '光明左使',30,3500);
insert into emp(id,name,age,salary) values(null, '光明右使',33,3200);


4.1.2 update型触发器

创建完update型触发器之后,执行update语句,即可在 emp_logs 表中看到信息。

1.  create trigger emp_logs_update_trigger

2.  after update

3.  on emp

4.  for each row

5.  begin

6.   insert into emp_logs(id,operation,operate_time,operate_id,operate_params)

7.   values(null,'update',now(),new.id,concat('修改前(id:',old.id,', name:',old.name,',

8.  age:',old.age,', salary:',old.salary,') , 修改后(id',new.id, 'name:',new.name,',

9.  age:',new.age,', salary:',new.salary,')'));

10.  end$

11.   

12.  update emp set age = 39 where id = 3;


4.1.3 delete型触发器

创建完delete型触发器之后,执行delete语句,即可在 emp_logs 表中看到信息。

create trigger emp_logs_delete_trigger
after delete
on emp
for each row
begin
  insert into emp_logs(id,operation,operate_time,operate_id,operate_params)
  values(null,'delete',now(),old.id,concat('删除前(id:',old.id,', name:',old.name,',
age:',old.age,', salary:',old.salary,')'));
end$
delete from emp where id = 5;


4.2 查看触发器

show triggers;

4.3 删除触发器

drop trigger [schema_name.]trigger_name;
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
存储 SQL NoSQL
|
1月前
|
存储 关系型数据库 MySQL
MySQL 存储过程返回更新前记录
MySQL 存储过程返回更新前记录
48 3
|
1月前
|
存储 SQL 关系型数据库
MySQL 存储过程错误信息不打印在控制台
MySQL 存储过程错误信息不打印在控制台
61 1
|
1月前
|
存储 SQL 关系型数据库
MySql数据库---存储过程
MySql数据库---存储过程
35 5
|
3月前
|
存储 关系型数据库 MySQL
Mysql表结构同步存储过程(适用于模版表)
Mysql表结构同步存储过程(适用于模版表)
48 0
|
3月前
|
存储 SQL 关系型数据库
MySQL 创建存储过程注意项
MySQL 创建存储过程注意项
42 0
|
4月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
|
4月前
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
5月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
5月前
|
存储 SQL 关系型数据库
MySQL存储过程和存储函数的使用
MySQL的存储过程和存储函数在功能和用法上有明显的区别。存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,通过指定名称和参数(如果有)来调用执行,可以返回多个值或结果集,但不直接返回值。而存储函数则是一个有返回值的特殊存储过程,它返回一个值或表对象,可以直接嵌入SQL语句中使用,如SELECT语句中。两者都是为了提高SQL代码的重用性和性能,但使用场景和方式有所不同。
4293 4