132.【MySQL_进阶】(八)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 132.【MySQL_进阶】

(六)、存储函数 (Function)

1.存储函数

(1).存储函数_介绍

存储函数是由返回值的存储过程,存储函数的参数只能是IN类型的。

(2).存储函数_语法
create function 存储函数名称 ([参数列表])
returns type [可选参数特性...]
begin 
  -- SQL语句;
  return ...;
end;
可选参数特性characteristic说明:  mysql8.0+必须要写
1. determinstic: 相同的输入参数总是产生相同的结果
2. not sql : 不包含sql语句
3. reads sql data: 包含读取数据的语句,但不包含写入数据的语句。
(3).存储函数_示列

计算从1累加到n的值,n为传入的参数值。

#默认为in且只能为in
create function fun_1(n int) 
returns int   
  begin
    declare total int default 0;
    WHILE n>0 DO
      set total := total+1;
      set n := n-1;
    END WHILE;
    return total;
  end;
select fun_1(10);

(七)、触发器 (Trigger )

1.触发器_介绍

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

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

行级触发器: 假如执行一条SQL语句,这一条SQL影响了N行,这个触发器会执行N次。

语句级触发器: 假如执行一条SQL语句,这一条影响了N行,这个触发器只会执行1次。

触发器类型 new 和 old
insert 型触发器 new 表示将要或者已经新增的数据
update 型触发器 old 表示要修改之前的数据,new 表示将要或已经修改后的数据
delete 型触发器 old 表示将要或者已经删除的数据

2.触发器_语法

1.创建触发器

create trigger 触发器名字
[before/after] [什么型触发器]
on 表名 for each row  --行级触发器
begin
  触发器语法;
end;

2.查看触发器

show triggers;

3.删除触发器

drop trigger [指定数据库名] 触发器名;  --如果没有指定触发器,默认当前数据库。

3.触发器_案列 (insert 类型)

通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表 user_logs中,包含增加、修改、删除;

一定要注意日志表的编码要和绑定的表的编码一致。否则报错Incorrect string value: '\xBD\xAA\xD7\xD3\xD1\xC0...' for column 'operate_pa

create table user_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=gbk;
-- 在主键自增的SQL表中,如果我们没有在表后面跟着所有的字段,那么我们需要给主键自增赋值为null。        如果在表后面跟了其他字段但没有主键字段,那么就不用写(默认为null)。
-- 1.插入触发器的语法
create trigger tb_user_insert_trigger
  -- 给tb_user2表行锁
  after insert on tb_user2 for each row
begin
  -- 利用new来获取我们新插入的数据
  insert into user_logs  values(null,'insert',now(),new.id,concat('插入的数据内容为: id=',new.id,'name=',new.name,'phone=',new.phone,'email=',new.email,'profession=',new.profession));
end;
--2.查询
show triggers;
-- 3.插入数据  (这里主键id的字段没写,所以不用添加null给主键,主键默认赋值为null)
INSERT INTO tb_user2 (name, phone, email, profession, age, gender, status,createtime) VALUES ('姜子牙4', '17799990023', '11111111@qq.com', '土木工程', 29,'1', '4', now());

4.触发器_案列 (update 类型)

-- 2.修改触发器
create trigger tb_user_update_trigger
  after update on tb_user2 for each row
begin
  insert into user_logs  values(null,'update',now(),new.id,concat(
  'UpdateBefor: id=',new.id,'name=',new.name,'phone=',new.phone,'email=',new.email,'profession=',new.profession,
  'updateAfter: id=',old.id,'name=',old.name,'phone=',old.phone,'email=',old.email,'profession=',old.profession
  ));
end;
update tb_user2 set age='11' where id=20;

5.触发器_案列(delete 类型)

create trigger tb_user_delete_trigger
  after delete on tb_user2 for each row
begin
  insert into user_logs  values(null,'delete',now(),old.id,concat(
  'delete: id=',old.id,'name=',old.name,'phone=',old.phone,'email=',old.email,'profession=',old.profession
  ));
end;
show triggers;
delete from tb_user2 where id = 21;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
存储 SQL 关系型数据库
MySQL语句详解:从基础到进阶的全面指南
MySQL语句详解:从基础到进阶的全面指南
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第三篇(MySQL性能优化)
MySQL数据库进阶第三篇(MySQL性能优化)
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库进阶第五篇(锁)
MySQL数据库进阶第五篇(锁)
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
52 1
|
6月前
|
JSON 关系型数据库 MySQL
MySQL常用函数解读:从基础到进阶的全方位指南
MySQL常用函数解读:从基础到进阶的全方位指南
|
6月前
|
SQL 关系型数据库 MySQL
Python进阶第二篇(Python与MySQL数据库)
Python进阶第二篇(Python与MySQL数据库)
|
6月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)