MySQL 触发器使用教程 - 六种触发器案例详解
触发器(Trigger)是 MySQL 中非常实用的一个功能,它可以在操作者对表进行「增删改」 之前(或之后)被触发,自动执行一段事先写好的 SQL 代码。
本教程带领大家在实践中学习,你将学到触发器在实际应用场景中的重要应用。
在这个教程中,你是「卡拉云银行」的程序员,你正在搭建一套银行客户管理系统。在这套系统中,你需要设置在 表之前检测操作者是否输入错误数据、在 时,记录操作者的行为 log ,以及在 时,判断删除的信息是否符合删除规则。 这三类操作都可以使用 MySQL 触发器来实现。
如果你正在数据库的基础上搭建一套数据库管理工具或企业内部工具,推荐你试试我开发的卡拉云,详情见后文。
本教程将带你一起实践的案例 : 在插入数据前,检测插入数据是否符合业务逻辑,如不符合返回错误信息。 : 在表 A 创建新账户后,将创建成功信息自动写入表 B 中。 :在更新数据前,检测更新数据是否符合业务逻辑,如不符合返回错误信息。 :在更新数据后,将操作行为记录在 log 中 :在删除数据前,检查是否有关联数据,如有,停止删除操作。 :删除表 A 信息后,自动删除表 B 中与表 A 相关联的信息。
先决条件
在开始之前,请确保您具备以下条件:一台配置好的 Ubuntu 服务器,root 账号。服务器上配置好 MySQL Server(配置 MySQL 请看MySQL安装及连接MySQL教程)MySQL root 账号
创建示例数据库
我们先创建一个干净的示例数据库,方便大家可以跟随本教程一起实践。我们会在这个数据库中演示 MySQL 触发器的多种工作方式。
首先,以 root 身份登录到你的 MySQL 服务器:
出现提示时,请输入你 MySQL root 账号的密码,然后点击 继续。看到 提示后,运行以下命令,创建 数据库:
接下来,切换到新建的 数据库:
接着创建一个 表。我们使用这个表记录银行客户的信息。这个表包括 ,,和。咱们先把客户分为两个级别:和。
接着,我们向 表中添加一些客户记录。
分别运行三个 命令后,命令行输出成功信息。
我们使用 检查一下三条信息是否已经写入表中:
下面我们创建另一个表,用于保存 表中客户的备注信息。
这个表包含 和 字段:
然后,我们再创建一个 表,这个表与 关联。保存与客户有关的销售数据。
最后一步,我们再建一个 表,用来记录操作员操作「卡拉云银行」客户管理系统时的操作行为。方便管理员在发生问题时,有 log 可查。
至此,你作为「卡拉云银行」的程序员,已经把客户管理系统的 数据库和四张表建立完成。接下来,我们将对这个管理系统的关键节点增加对应的触发器。
扩展阅读:《如何使用 MySQL 慢查询日志进行性能优化 - Profiling、mysqldumpslow 实例详解》
1.触发器使用方法
作为严谨的银行客户管理系统,对任何写入系统的数据都应该提前检测,以防止错误的信息被写进去。
在写入前检测数据这个功能,我们可以使用 触发器来实现。
在操作者对 表中的 字段进行写操作时,系统将在写入()前检查数据是否符合规范。
我们先来看一下,创建触发器的基本语法。
触发器的结构包括::MySQL 默认分隔符是 但在触发器中,我们使用 表示触发器的开始与结束。:这里填写触发器的名字:这里设置触发器是在关键动作执行之前触发,还是执行之后触发。:触发器可以监测 、、 的操作,当监测的命令对触发器关联的表进行操作时,触发器就被激活了。:将这个触发器与数据库中的表进行关联,触发器定义在表上,也附着在表上,如果这个表被删除了,那么这个触发器也随之被删除。:这句表示只要满足触发器触发条件,触发器都会被执行,也就是说带上这个参数后,触发器将监测每一行对关联表操作的代码,一旦符合条件,触发器就会被触发。:这里是当满足触发条件后,被触发执行的代码主体。这里可以是一句 SQL 语句,也可以是多行命令。如果是多行命令,那么这些命令要写在 之间。
**注:**在创建触发器主体时,还可以使用和 来获取 SQL 执行,和 操作前后的写入数据。这里没看明白没关系,我们将会在接下来的实践中,展开讲解。
讲到这里,大家看了一大堆云里雾里的概念,如果没看懂,也别担心。接下来进入实践环节,只要跟着贴代码看返回结果,很快你就能够通透理解触发器了。
现在,我们来创建第一个触发器, (在执行 之前,执行触发器)。这个触发器用于监测操作者在写入 表中的 值时,这个值是否大于 ,如果大于,那么返回错误信息进行报错。
登录 MySQL Server 后,我们创建一个触发器:
上面这段代码中,我们使用 来创建一个监测 语句写入的值是否在限定的范围内的触发器。
这个触发器的功能时监测 在写入 值时,这个新增的()值是否符合条件( )。
当操作员录入一个超过 10000 的数字,会返回如下错误信息:
我们来试试看,看看触发器是否已启用。
我们向 中插入一条 的值。
命令行返回错误信息,这就是我们刚刚创建触发器时,填入的错误信息。与我们的设置一致。
下面我们 一个值小于 的数字:
输入值为 小于设定的 , 命令执行成功。
我们调出 表,看看是否插入成功:
输出确认数据在表中:
![确认数据在表中]](https://img-blog.csdnimg.cn/img_convert/41b92d1198e5f7d227e108a25ff144c2.png)
通过这张表,我们可以看到,7700 已经插入到表中。
刚刚我们演示了在执行 命令前,检测某个值是否符合设定,接着我们来看在执行 之后,使用触发器将不同的值保存到不同的表中。
扩展阅读:《如何在两台服务器之间迁移 MySQL / MariaDB 数据库 阿里云腾讯云迁移案例》
2.触发器使用方法
接着我们讲解 ,触发器在监测到我们成功执行了 命令后,再执行触发器中设置好的代码。
例如:在银行账户系统中,当我们新建一个账户后,我们将创建成功信息写入对应的 表中。
在这个案例中,你作为「卡拉云银行」的程序员,现在要创建一个触发器,在创建新客户账户后,将成功信息写入 表中
要创建触发器,请输入以下命令:
这个触发器在操作者向 表中 新客户信息后,再向 表对应的行中写入成功信息。
现在我们 一条信息,看看触发器是否已启用:
记录 成功,接着我们来检查表中是否写入了对应的成功数据。
这里可以看到,我们向 表插入了一个 为 的新用户 ,随后,触发器根据代码自动向 表中也插入了一个 为 的开户成功信息。
特别适合这种状态变更的关联写入操作。比如开户、暂停、注销等各类状态变更。
到这里,触发器在执行前、后的应用,我们已经讲完了,接着我们来讲 触发器。
扩展阅读:《MySQL 配置文件 my.cnf / my.ini 逐行详解》
3.触发器使用方法
触发器与 触发器非常类似,我们可以使用 触发器在更新数据之前,先做一次业务逻辑检测,避免发生误操作。
刚刚我们创建示例数据库时,创建了两个级别的客户,VIP 和 BASIC 级别。卡拉云银行的客户一旦升级至 VIP,就不能再降级至 BASIC 级别了。
我们使用 来贯彻这一规则,这个触发器将在 语句执行之前,先判断是否为降级行为,如果是,则输出报错信息。
我们来创建这个触发器:
我们可以使用 来获取执行 命令前,客户的 值。同样,我们使用该语句来对 值是否符合规则进行判断。
我们先来查看一下 表中的数据。
好,我们选一个已经是 VIP 级别的客户,对他进行降级操作,看看我们的触发器是否能够正确执行。
接下来,运行以下 SQL 命令,试试能不能将 为 的 VIP 客户降级成 客户:
执行代码后,命令行返回错误信息:
这说明我们刚刚设置的触发器已经起作用了。
接着我们来试试,对一个级别的客户运行相同的命令,看看能不能把他升级到级别:
执行成功:
我们再来看一下 表中的数据情况:
可以看到刚才 为 的 客户已经升级为 客户。
触发器用于在更新数据前进行确认,很好的守护了系统的业务规则。接着我们来看看 在客户管理系统中的应用。
扩展阅读:《MySQL Workbench 操作 MySQL / MariaDB 数据库中文指南》
4.触发器使用方法
本节我们来演示 在实际中的应用。 多用于 log 记录,在管理系统多操作者使用的环境中,管理员需要设置操作 log 记录,以便在出问题时,可以查看操作者对表编辑的操作,可追根溯源。
我们先来创建一个对 表操作的 log 记录触发器。
当操作者对 表进行修改后,操作记录会被写入 表中。
触发器将监测用户 ID 、更新前的销售总额、更新后的销售总额、操作者 ID、修改时间等信息,作为 log 存入 表中。
使用以下命令建立这个 log 记录触发器:
当操作者对 表中的一条客户信息进行 操作时,触发器会在操作之后,将操作行为记录在 中。包括 ,修改 值的前后变化。
销售总额的变化是审计的关键数据,所以要把它记录在 中。使用 来获取更新前的 值,使用 来获取更新后的值。
另外我们还要记录修改 表的操作者信息及操作时间。
你可以使用 来检测当前操作用户的账号,用 语句抓去当前服务器日期和时间。
为了测试这个触发器,我们先在 表中创建一条信息记录:
接下来,我们来更新这条记录:
您将看到以下输出:
理论上,我们更新了 表后,触发器应该触发了操作,将我们刚刚的修改记录到了 表中。我们用以下命令,看看 表中是否已经有记录了。
如下表,触发器更新了 表,表中包含了 更新前的旧值和更新后的新值。
至此,使用 制作的 log 自动记录触发器就完成了。
下一节,我们来学习 相关的触发器。
扩展阅读:《如何查看 MySQL 数据库、表、索引容量大小?找到占用空间最大的表》
5.触发器使用方法
触发器会在语句执行之前调用。
这些类型的触发器通常用于在不同的相关表上强制执行参照完整性。
的应用场景通常是确保有关联的数据不被错误的误删除掉。
例如: 表通过 与表相关联。如果操作者删除了 表中的一条数据,那么 表中某些数据就失去了关联线索。
为了避免这种情况的发生,我们需要创建一个 触发器,防止记录被误删除。
现在,我们试着删除有销售关联信息的客户:
所以,你会看到以下输出:
这个触发器做到了先检测 是否与正要被删除的 表中的数据有关联,防止有关联信息的数据被误删除。
不过有时候,我们需要删除主数据后,再让系统自动帮我们删除与之相关联的其他所有数据。这时,我们就要用到 这个触发器了。
扩展阅读:《在 MySQL 中 DATETIME 和 TIMESTAMP 时间类型的区别及使用场景 - 实战案例讲解》
6.触发器使用方法
接着说说 ,一旦记录被成功删除,这个触发器就会被激活。
这个触发器在实际场景用的应用也比较广泛。比如银行系统中的升级降级操作,当客户花掉自己的账户积分后,激活触发器,触发器可以判断剩余积分是否满足客户当前等级,如果不满足,自动做降级操作。
触发器的另一个用途是在删除主表中的数据后,与这个主表关联的数据,一起自动删除。
我们来看一下这个触发器如何创建:
接下来,我们来试试这个触发器。删除销售记录中 为 的销售记录:
接着我们检查以下 表中的关联信息是否一起自动删除:
命令行会返回 的结果,我们刚刚删除了 表中的信息后, 表中的关联信息也被一起删除了。
以上就是 MySQL 触发器的六种使用方式和对应的场景。
扩展阅读:《最好用的 10 款 MySQL / MariaDB 管理工具横向测评 - 免费和付费到底怎么选?》
7.查看触发器
(1)直接查看触发器
当我们想查看数据库中的触发器有哪些时,可用以下命令:
后面加上 是触发器列表竖排列:
刚刚我们创建的触发器都罗列在这个列表当中了。
(2)在 triggers 表中查看触发器信息
在 MySQL Server 中,数据库 的 表中存着所有触发器的信息。所有我们可以通过 来查看。
当然,也可以不指定触发器名称,来查看所有。
扩展阅读:《如何在 MySQL / MariaDB 中查询数据库中带有某个字段/列名的所有表名》
8.删除触发器
最后,咱们来说说如何删除触发器。删除命令也很简单, 即可。
例如,咱们把刚刚创建的最后一个触发器删掉:
特别提示:我们不能对已经创建好的触发器进行修改。如果你想修改,只能先删除,再重新创建。
扩展阅读:《MySQL / MariaDB 中如何存储图片 BLOB 数据类型详解》
9.总结
在本教程中,我们展示了触发器的六种形式,即在、、 执行前或后执行触发器,以及对应的六个实战案例。 : 在插入数据前,检测插入数据是否符合业务逻辑,如不符合返回错误信息。 : 在表 A 创建新账户后,将创建成功信息自动写入表 B 中。 :在更新数据前,检测更新数据是否符合业务逻辑,如不符合返回错误信息。 :在更新数据后,将操作行为记录在 log 中 :在删除数据前,检查是否有关联数据,如有,停止删除操作。 :删除表 A 信息后,自动删除表 B 中与表 A 相关联的信息。
接着推荐一下卡拉云,只要你会写 MySQL ,就能使用卡拉云搭建自己的数据工具,比如,数据看板,企业 CRM、ERP,权限管理后台,对账系统等。
卡拉云是新一代低代码开发工具,免安装部署,可一键接入包括 MySQL 在内的常见数据库及 API。可根据自己的工作流,定制开发。无需繁琐的前端开发,只需要简单拖拽,即可快速搭建企业内部工具。数月的开发工作量,使用卡拉云后可缩减至数天,欢迎免费试用卡拉云。卡拉云可一键接入常见的数据库及 API
卡拉云可根据公司工作流需求,轻松搭建数据看板或其他内部工具,并且可一键分享给组内的小伙伴。
下图为使用卡拉云在 5 分钟内搭建的「优惠券发放核销」后台,仅需要简单拖拽即可快速生成前端组件,只要会写 SQL,便可搭建一套趁手的数据库工具。欢迎免费试用卡拉云。
本文首发:MySQL / MariaDB 触发器的创建、使用、查看、删除教程及应用场景实战案例
有关 MySQL 教程,可继续拓展学习:如何远程连接 MySQL 数据库,阿里云腾讯云外网连接教程如何在 MySQL / MariaDB 中导入导出数据,导入导出数据库文件、Excel、CSV如何在两台服务器之间迁移 MySQL 数据库 阿里云腾讯云迁移案例MySQL 重置自增 ID (AUTO_INCREMENT)教程 - 完美保留表数据的终极解决方案