MySQL自定义函数及触发器


Posted in MySQL onAugust 05, 2022

1. 存储函数(自定义函数)

  • 自定义函数是一种对MySQL扩展的途径,其用法与内置的函数相同。
  • 定义函数的两个必要条件:参数、返回值。函数可以返回任意类型的值,同样可以接收这些类型的参数。

关于函数体:

  • 函数体是由合法的SQL语句构成。
  • 函数体可以是简单的SELECT或INSERT语句。
  • 函数体如果为符合结构则使用BEGIN....AND语句包裹。
  • 复合结构可以包含声明、循环、控制结构等等。

重点:自定义的函数不能重名,类似于定义了一个全局变量,变量名不能一致。

1.1 定义存储函数

语法格式:

create function 函数名(参数列表)
returns type(返回值类型)
begin
    --SQL语句
end;

需求:定义一个存储过程的函数,获取满足条件的总记录条数

实现:

delimiter $
create function fun(countryId int)
returns int 
begin
    # 定义一个存储总数据条数的变量
    declare cum int default 0;
    # 查询等于传递参数的全部的数据数,然后将其赋值给定义的变量
    select count(*) into cum from city where country_id = countryId;
    # 返回结果值。存储函数必须有返回值
    return cum;
end $

delimiter ;

1.2 调用存储函数

语法格式:

select 函数名(参数列表);

注意:调用存储过程的时候使用的是call关键字,但是在调用存储函数的时候直接使用select即可,就和调用MySQL一个普通的聚合函数的方式一样即可。

select fun(1);
# 这里和存储过程一样,调用的时候需要加小括号和参数,但是在删除的时候指定函数名即可

1.3 删除存储函数

语法格式

drop [if exists] function fun;

2. 触发器

2.1 触发器介绍

  • 触发器是与表有关的数据库对象,指在 insert/update/delete 之前或之后,触发并执行触发器中定义的SQL集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性、日志记录以及数据校验等操作。
  • 只有增加、删除、修改的时候才可以使用触发器,查询的时候不可以使用触发器。
  • 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似对的。MySQL触发器还只支持行级触发,不支持语句级触发。oracle支持行级和语句级触发器都支持。
  • OLD、NEW这两个变量又叫做行记录变量。可以通过这个两个变量来获取即将要操作的数据表中的数据。

MySQL自定义函数及触发器

2.2 创建触发器

语法格式:

create trigger(触发器) trigger_name(触发器名称)
before/after insert/update/delete
on tab_name(表名)
[for each row](行级触发器)
begin
    trigger_stmt;(触发器的逻辑)
end;

需求:通过触发器记录 emp 表的数据变更日志 emp_logs ,其中包含增加、修改、删除

实现:

分析:一个触发器只能操作一种数据的操作类型,不可以同时完成增加、修改、删除的操作。所以此时需要定义多个触发器来完成这个日志记录的任务。

因为 MySQL中是行级操作的触发器,所以 new 以及 old 中存储的都是一整行数据。

创建执行 insert 的触发器:

MySQL自定义函数及触发器

  • 使用 new 关键字可以获取到操作的数据,在insert模式下,new变量中存储的就是即将插入的数据
  • 使用的是 after ,在执行完表 emp 的新增之后执行这个触发器记录日志。
  • 这个触发器什么时候执行与两点有关:
    • 必须操作的是 emp 这个表,也就是on后面声明的这个表。
    • 必须执行的 insert 操作。

创建执行 update 的触发器:

MySQL自定义函数及触发器

此时 old 变量中存储的是被修改前的数据,new 变量中存储的是修改之后的数据

创建执行 delete 的触发器:

MySQL自定义函数及触发器

此时的 old 变量中存储的即将删除的数据

测试:测试都必须是操作的 emp 表,这样才会触发上边定义的触发器。

MySQL自定义函数及触发器

2.3 删除触发器

语法结构:

drop trigger [schema_name.](数据库名)trigger_name(触发器名);

如果没有指定 schema_name(数据库名),默认为当前数据库。

2.4 查看触发器

可以通过执行 show triggers 命令查看触发器的状态、语法等信息。

语法结构:

show triggers;

到此这篇关于MySQL自定义函数以及触发器的文章就介绍到这了,更多相关MySQL 触发器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL基础(一)
Apr 05 MySQL
数据库连接池
Apr 06 MySQL
MYSQL主从数据库同步备份配置的方法
May 26 MySQL
mysql如何配置白名单访问
Jun 30 MySQL
MySQL分库分表详情
Sep 25 MySQL
mysql下的max_allowed_packet参数设置详解
Feb 12 MySQL
一文弄懂MySQL索引创建原则
Feb 28 MySQL
Mysql外键约束的创建与删除的使用
Mar 03 MySQL
MySQL实战记录之如何快速定位慢SQL
Mar 23 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 MySQL
mysql数据库如何转移到oracle
Dec 24 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 #MySQL
Mysql中mvcc各场景理解应用
Aug 05 #MySQL
数据设计之权限的实现
一文解答什么是MySQL的回表
Aug 05 #MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 #MySQL
SQLServer常见数学函数梳理总结
Aug 05 #MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 #MySQL
You might like
MVC模式的PHP实现
2006/10/09 PHP
php设计模式 Builder(建造者模式)
2011/06/26 PHP
PHP Warning: PHP Startup: Unable to load dynamic library \ D:/php5/ext/php_mysqli.dll\
2012/06/17 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
PHP目录操作实例总结
2016/09/27 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
你必须知道的Javascript知识点之"字面量和对应类型"说明介绍
2013/04/23 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
JavaScript File API实现文件上传预览
2016/02/02 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
Angular.js如何从PHP读取后台数据
2016/03/24 Javascript
分享bootstrap学习笔记心得(组件及其属性)
2017/01/11 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
详解Ant Design of React的安装和使用方法
2018/12/27 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
JavaScript中跨域问题的深入理解
2021/03/04 Javascript
python操作数据库之sqlite3打开数据库、删除、修改示例
2014/03/13 Python
python字典操作实例详解
2017/11/16 Python
Django中间件工作流程及写法实例代码
2018/02/06 Python
Python及Pycharm安装方法图文教程
2019/08/05 Python
pytorch之添加BN的实现
2020/01/06 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
什么时候用assert
2015/05/08 面试题
幼师自荐信范文
2013/10/06 职场文书
父亲生日宴会答谢词
2014/01/10 职场文书
教师创先争优承诺书
2015/04/27 职场文书
Python基础数据类型tuple元组的概念与用法
2021/08/02 Python