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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 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
相关文章
|
3天前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
12 4
|
3天前
|
SQL JavaScript 关系型数据库
Mysql索引不当引发死锁问题
本文通过真实案例解析了MySQL在高并发环境下出现死锁的问题。数据库表`t_award`包含多个索引,但在执行特定SQL语句时遭遇索引失效,导致更新操作变慢并引发死锁。分析发现,联合索引`(pool_id, identifier, status, is_redeemed)`因`identifier`允许为空值而导致索引部分失效。此外,`pool_id`上的普通索引产生的间隙锁在高并发下加剧了死锁风险。为解决此问题,文中提出了调整索引顺序至`(pool_id, status, is_redeemed, identifier)`等方案来优化索引使用,进而减轻死锁现象。
|
6天前
|
缓存 NoSQL Redis
一天五道Java面试题----第九天(简述MySQL中索引类型对数据库的性能的影响--------->缓存雪崩、缓存穿透、缓存击穿)
这篇文章是关于Java面试中可能会遇到的五个问题,包括MySQL索引类型及其对数据库性能的影响、Redis的RDB和AOF持久化机制、Redis的过期键删除策略、Redis的单线程模型为何高效,以及缓存雪崩、缓存穿透和缓存击穿的概念及其解决方案。
|
13天前
|
缓存 关系型数据库 MySQL
MySQL调优秘籍曝光!从索引到事务,全方位解锁高可用秘诀,让你的数据库性能飞起来!
【8月更文挑战第6天】MySQL是顶级关系型数据库之一,其性能直接影响应用的高可用性与用户体验。本文聚焦MySQL的高性能调优,从索引设计到事务管理,逐一解析。介绍如何构建高效索引,如联合索引`CREATE INDEX idx_order_customer ON orders(order_id, customer_id);`,以及索引覆盖查询等技术。
39 0
|
2月前
|
存储 关系型数据库 MySQL
MySQL触发器实战:自动执行的秘密
MySQL触发器实战:自动执行的秘密
55 3
|
2月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
2月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
19天前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
|
29天前
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
2月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)

热门文章

最新文章