MySQL深入浅出精讲触发器用法

推荐学习:mysql视频教程

在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分 别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时 在库存表中添加一条库存记录。 这样一来,我们就必须把这两个关联的操作步骤写到程序里面,而且要用 事务 包裹起来,确保这两个操 作成为一个 原子操作 ,要么全部执行,要么全部不执行。

要是遇到特殊情况,可能还需要对数据进行手 动维护,这样就很 容易忘记其中的一步 ,导致数据缺失。 这个时候,咱们可以使用触发器。你可以创建一个触发器,让商品信息数据的插入操作自动触发库存数 据的插入操作。这样一来,就不用担心因为忘记添加库存数据而导致的数据缺失了。

触发器概述

MySQL从 5 . 0 . 2 版本开始支持触发器。 MySQL的触发器和存储过程一样,都是嵌入到MySQL服务器的一 段程序。 触发器是由 事件来触发 某个操作,这些事件包括 INSERT 、 UPDATE 、 DELETE 事件。

所谓事件就是指 用户的动作或者触发某项行为。如果定义了触发程序,当数据库执行这些语句时候,就相当于事件发生 了,就会 自动 激发触发器执行相应的操作。 当对数据表中的数据执行插入、更新和删除操作,需要自动执行一些数据库逻辑时,可以使用触发器来 实现。

触发器的创建

创建触发器语法

CREATE TRIGGER 触发器名称 {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON 表名 FOR EACH ROW 触发器执行的语句块;

说明:

表名 :表示触发器监控的对象。

BEFORE | AFTER :表示触发的时间。 BEFORE 表示在事件之前触发; AFTER 表示在事件之后触发。

INSERT | UPDATE | DELETE :表示触发的事件。

INSERT 表示插入记录时触发;

UPDATE 表示更新记录时触发;

DELETE 表示删除记录时触发。

代码举例1

创建俩张表

CREATE TABLE test_trigge r (id INT PRIMARY KEY AUTO_INCREMENT ,t_note VARCHAR ( 30 )) ;CREATE TABLE test_trigger_log (id INT PRIMARY KEY AUTO_INCREMENT ,t_log VARCHAR ( 30 )) ;

创建触发器

DELIMITER / /CREATE TRIGGER befo_re_insertBEFORE INSERT ON test_trigger FOR EACH ROWBEGIN INSERT INTO test_trigger_log ( t_log ) VALUES ( ' befo re_inse rt ' ) ;END / /DELIMITER ;

向test_trigger数据表中插入数据

INSERT INTO test_trigger (t_note) VALUES ('测试 BEFORE INSERT 触发器');

MySQL深入浅出精讲触发器用法

查看test_trigger_log数据表中的数据

SELECT * FROM test_trigger_log

MySQL深入浅出精讲触发器用法

代码举例2

创建触发器

DELIMITER / /CREATE TRIGGER after_insertAFTER INSERT ON test_triggerFOR EACH ROWBEGIN INSERT INTO test_trigger_log ( t_log ) VALUES ( ' after_insert ' ) ;END / /DELIMITER ;

向test_trigger数据表中插入数据。

INSERT INTO test_trigger (t_note) VALUES ('测试 AFTER INSERT 触发器');

查看test_trigger_log数据表中的数据

SELECT * FROM test_trigger_log

MySQL深入浅出精讲触发器用法

代码举例3

定义触发器“salary_check_trigger”,基于员工表“employees”的INSERT事件,在INSERT之前检查将要添加的新员工薪资是否大于他领导的薪资,如果大于领导薪资,则报sqlstate_value为’HY000’的错误,从而使得添加失败。

DELIMITER //CREATE TRIGGER salary_check_triggerBEFORE INSERT ON employees FOR EACH ROWBEGINDECLARE mgrsalary DOUBLE;SELECT salary INTO mgrsalary FROM employees WHERE employee_id = NEW.manager_id;IF NEW.salary > mgrsalary THENSIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = '薪资高于领导薪资错误';END IF;END //DELIMITER ;

上面触发器声明过程中的NEW关键字代表INSERT添加语句的新记录。

查看删除触发器

方式1:查看当前数据库的所有触发器的定义

SHOW TRIGGERS

方式2:查看当前数据库中某个触发器的定义方式

SHOW CREATE TRIGGER 触发器名

方式3:从系统库information_schema的TRIGGERS表中查询“salary_check_trigger”触发器的信息。

SELECT * FROM information_schema.TRIGGERS;

删除触发器

DROP TRIGGER IF EXISTS 触发器名称

触发器的优点

1、触发器可以确保数据的完整性。

假设我们用 进货单头表 (demo.importhead)来保存进货单的总体信息,包括进货单编号、供货商编号、仓库编号、总计进货数量、总计进货金额和验收日期。

MySQL深入浅出精讲触发器用法

用 进货单明细表 (demo.importdetails)来保存进货商品的明细,包括进货单编号、商品编号、进货数

MySQL深入浅出精讲触发器用法

量、进货价格和进货金额额就不等于进货单明细表中数量合计和金额合计了,这就是数据不一致。

为了解决这个问题,我们就可以使用触发器,规定每当进货单明细表有数据插入、修改和删除的操作

时,自动触发 2 步操作:

1)重新计算进货单明细表中的数量合计和金额合计;

2)用第一步中计算出来的值更新进货单头表中的合计数量与合计金额。

这样一来,进货单头表中的合计数量与合计金额的值,就始终与进货单明细表中计算出来的合计数量与

合计金额的值相同,数据就是一致的,不会互相矛盾。

2、触发器可以帮助我们记录操作日志。

利用触发器,可以具体记录什么时间发生了什么。比如,记录修改会员储值金额的触发器,就是一个很

好的例子。这对我们还原操作执行时的具体场景,更好地定位问题原因很有帮助。

3、触发器还可以用在操作数据前,对数据进行合法性检查。

比如,超市进货的时候,需要库管录入进货价格。但是,人为操作很容易犯错误,比如说在录入数量的

时候,把条形码扫进去了;录入金额的时候,看串了行,录入的价格远超售价,导致账面上的巨亏……

这些都可以通过触发器,在实际插入或者更新操作之前,对相应的数据进行检查,及时提示错误,防止

错误数据进入系统。

触发器的缺点

1、触发器最大的一个问题就是可读性差。

因为触发器存储在数据库中,并且由事件驱动,这就意味着触发器有可能 不受应用层的控制 。这对系统维护是非常有挑战的。

比如,创建触发器用于修改会员储值操作。如果触发器中的操作出了问题,会导致会员储值金额更新失败。我用下面的代码演示一下

MySQL深入浅出精讲触发器用法

结果显示,系统提示错误,字段“aa”不存在。

这是因为,触发器中的数据插入操作多了一个字段,系统提示错误。可是,如果你不了解这个触发器,很可能会认为是更新语句本身的问题,或者是会员信息表的结构出了问题。说不定你还会给会员信息表添加一个叫“aa”的字段,试图解决这个问题,结果只能是白费力。

2、相关数据的变更,可能会导致触发器出错。

特别是数据表结构的变更,都可能会导致触发器出错,进而影响数据操作的正常运行。这些都会由于触发器本身的隐蔽性,影响到应用中错误原因排查的效率。

注意点

注意,如果在子表中定义了外键约束,并且外键指定了ON UPDATE/DELETE CASCADE/SET NULL子句,此时修改父表被引用的键值或删除父表被引用的记录行时,也会引起子表的修改和删除操作,此时基于子表的UPDATE和DELETE语句定义的触发器并不会被激活。

例如:基于子表员工表(t_employee)的DELETE语句定义了触发器t1,而子表的部门编号(did)字段定义了外键约束引用了父表部门表(t_department)的主键列部门编号(did),并且该外键加了“ONDELETE SET NULL”子句,那么如果此时删除父表部门表(t_department)在子表员工表(t_employee)

推荐学习:mysql视频教程

以上就是MySQL深入浅出精讲触发器用法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/171169.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
win10怎么查看硬盘是固态还是机械_win10硬盘类型检测与分辨方法
上一篇 2026年8月29日 09:31:35
B站在线免费进入网站入口快速直连
下一篇 2026年8月29日 09:35:29

相关推荐

  • mysql中是什么意思 mysql语法符号含义解析

    mysql 中的符号和关键字是与数据库交互的基本工具,正确使用它们可以提高工作效率和查询准确性。1. 逗号(,)用于分隔列表中的元素,如列名和值。2. 点号(.)用于访问表中的列或调用函数。3. 星号(*)用于选择所有列,但应避免使用以提高查询性能。4. 百分号(%)用于 like 操作中的模式匹配…

    2026年9月24日
    000
  • PHP+MySQL培训课程的费用性价比分析

    php+mysql培训课程的性价比高,具体体现在:1.课程内容深度和广度,涵盖框架使用和项目经验;2.实用性和就业前景,提供实战项目和就业指导;3.师资力量和教学方式,名师能激发学习热情;4.学习资源和社区支持,提供丰富资料和交流平台。 在考虑报名PHP+MySQL培训课程之前,很多人都会问:这些课…

    2026年9月24日
    100
  • 使用MySQL命令行客户端进行交互式管理

    使用MySQL命令行客户端进行交互式管理使用MySQL命令行客户端进行交互式管理使用MySQL命令行客户端进行交互式管理使用MySQL命令行客户端进行交互式管理

    mysql命令行客户端的常用命令包括:1. 使用mysql -u 用户名 -p命令连接数据库;2. 执行show databases;查看所有数据库;3. 使用use 数据库名;选择数据库;4. 使用select * from 表名;查询数据;5. 使用insert into 表名 (列1, 列2)…

    2026年9月24日 用户投稿
    500
  • 数据实时迁移同步工具 CloudCanal v5.2.0.0 发布,支持 SaaS 全托管

    cloudcanal 免费社区版 是 clougence 公司推出的一款全自研、可视化、自动化数据迁移同步工具,具备 结构迁移、数据迁移、数据同步、数据校验、数据订正 等功能,支持 60+ 款流行关系型数据库、实时数仓、消息中间件、缓存数据库和搜索引擎之间数据互通,其中包含国产数据库 oceanba…

    2026年9月24日
    000
  • 怎么在mysql中创建数据库表 mysql建表完整流程解析

    在 mysql 中创建数据库表的步骤包括:1) 选择合适的数据类型,如 int、varchar、timestamp;2) 设置索引,如主键和唯一索引;3) 应用约束条件,如 not null 和 unique;4) 设计表结构以满足业务需求,如使用 foreign key 和 enum;5) 优化性…

    2026年9月24日
    000
  • hive安装配置实验

    一、安装前的准备工作 1. 配置并安装hadoop,请参考链接http://blog.csdn.net/wzy0623/article/details/50681554。 2. 下载以下安装包:mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz、apache-hive…

    2026年9月24日
    600
  • 命令行下MySQL中文乱码如何设置utf8编码

    mysql命令行中文乱码解决方法是统一各环节字符集为utf8mb4。具体步骤如下:1.查看当前编码设置,确认character_set相关变量是否为utf8或utf8mb4;2.修改配置文件,在[client]和[mysqld]下设置默认字符集为utf8mb4并重启服务;3.修改已有数据库和表的字符…

    2026年9月24日
    100
  • 如何解决MySQL安装时配置不生效的处理方法?

    如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?如何解决MySQL安装时配置不生效的处理方法?

    配置mysql时遇到配置不生效的问题,常见原因包括配置文件路径错误、语法问题、命令行参数覆盖及数据目录权限或初始化问题。1. 配置文件路径是否正确?mysql只会读取特定路径的配置文件,建议使用命令mysql –help | grep “default options&#82…

    2026年9月24日 用户投稿
    000
  • mysql如何优化表结构?表结构设计方法

    设计和优化 mysql 表结构应从字段类型选择、主键与索引设计、冗余与范式处理、分表分区策略四个方面入手。1. 合理选择字段类型,如整数用 int/bigint,枚举值用 enum 或 tinyint,日期用 datetime,避免过度使用 text/blob;2. 主键建议使用自增整型,避免长字段…

    2026年9月24日
    1000
  • MySQL查询结果的排序和分页实现方法

    在mysql中,可以通过order by和limit关键字高效实现排序和分页。1.使用order by进行排序,支持升序和降序。2.使用limit和offset进行分页,控制返回结果的起始位置和数量。3.通过在排序列上创建索引,可以优化大数据集的查询性能。4.避免使用大offset值,改用主键或唯一…

    2026年9月24日
    100
  • mysql中如何排查磁盘空间不足问题

    先检查磁盘使用情况,使用df -h和du -sh定位大文件;再通过SQL查询分析数据库和表的空间占用;接着检查binlog、慢查询日志及临时文件;最后采取删除无用数据、归档、压缩、分区等措施释放空间并优化配置。 当MySQL出现磁盘空间不足时,可能会导致写入失败、服务中断甚至实例崩溃。排查这类问题需…

    2026年9月23日
    100
  • 如何在mysql中使用数值函数计算

    答案:MySQL数值函数用于执行数学运算,如ABS、ROUND、FLOOR、CEIL、MOD、POWER、SQRT等,可对数据直接计算。例如用ROUND四舍五入价格,TRUNCATE截断小数,FLOOR取整,MOD求余判断奇偶,SQRT开方,还可结合AVG、MAX等聚合函数使用,提升查询效率并减少应…

    2026年9月23日
    200
  • PHP同页面无限次表单提交与显示:防止数据覆盖的实现技巧

    本教程详细阐述了如何在php中实现同页面多次表单提交而不覆盖先前数据的方法。核心策略是利用html的数组命名输入(`name=”field[]”`)来收集多个值,并在每次页面刷新时,通过隐藏输入字段重新提交已有的数据,从而在不依赖数据库的情况下,实现“无限”次提交并显示所有历…

    2026年9月23日
    100
  • 如何在mysql中优化存储引擎参数

    优化MySQL存储引擎需根据业务场景调整参数。1. InnoDB:设innodb_buffer_pool_size为内存50%~70%,合理配置日志参数提升I/O性能,选用O_DIRECT减少缓存冲突,按磁盘性能设置io_capacity;2. MyISAM:分配足够key_buffer_size,…

    2026年9月23日
    100
  • 如何预防单点故障?VIP高可用搭建解决步骤

    如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤如何预防单点故障?VIP高可用搭建解决步骤

    单点故障是系统稳定性最大威胁,因为其一旦发生将导致服务瞬间瘫痪。解决核心在于消除“唯一”组件,通过构建高可用集群实现冗余备份。具体步骤包括:1. 使用虚拟ip(vip)配合keepalived工具实现自动漂移;2. 配置至少两台服务器组成集群并通过心跳机制监测状态;3. 设置track_script…

    2026年9月23日 用户投稿
    500
  • mysql中cno是什么意思 mysql列名常见缩写解析

    在mysql中,”cno”通常指的是”course number”(课程编号)。1. “cno”在教育系统中用于唯一标识课程,常作为主键。2. 其他常见缩写包括”sno”(学生编号)、”tno…

    2026年9月23日
    100
  • 使用 Dompdf 一键生成大量 PDF 文件的优化方案

    本文旨在解决使用 Dompdf 生成大量 PDF 文件时遇到的超时问题。通过分析常见原因,提出了从Web服务器环境迁移到命令行环境,并配合 set_time_limit(0) 函数来避免执行超时,从而高效生成多个包含大量数据的 PDF 文件。 问题分析 从提供的代码片段可以看出,程序通过循环遍历 $…

    2026年9月23日
    600
  • mysql安装后怎么锁 mysql锁机制与使用方法详解

    mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解mysql安装后怎么锁 mysql锁机制与使用方法详解

    mysql 的锁机制通过表级锁和行级锁管理并发访问,使用时需结合索引、事务控制以避免阻塞和死锁。1. 锁类型包括 myisam 的表级锁(读锁共享、写锁排他)和 innodb 的行级锁(记录锁、间隙锁、临键锁),后者并发性能更高;2. 手动加锁可通过 select … lock in s…

    2026年9月23日 用户投稿
    100
  • 如何在mysql中分析锁竞争问题

    首先通过系统表和InnoDB状态定位锁竞争,再结合Performance Schema分析锁事件,最后优化事务和SQL以减少冲突。 在MySQL中分析锁竞争问题,关键在于识别哪些事务或查询正在阻塞其他操作,以及这些锁是如何产生的。通常锁竞争会导致响应变慢、连接堆积甚至死锁。下面从几个实用角度来展开分…

    2026年9月23日
    200
  • mysql在哪里输入创建表语句 mysql代码执行环境介绍

    mysql在哪里输入创建表语句 mysql代码执行环境介绍mysql在哪里输入创建表语句 mysql代码执行环境介绍mysql在哪里输入创建表语句 mysql代码执行环境介绍mysql在哪里输入创建表语句 mysql代码执行环境介绍

    选择mysql客户端需根据工作习惯和需求决定。①若喜欢敲命令,可选mysql自带命令行客户端,轻量直接但需记忆命令;②若偏好图形界面,navicat或dbeaver更直观,支持可视化操作,其中dbeaver跨平台且支持多数据库;③其他常用工具如sql developer(适合oracle用户)、da…

    2026年9月23日 用户投稿
    300

发表回复

登录后才能评论
关注微信