我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL 触发器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL 触发器

触发器(Trigger)是与表关联的命名数据库对象,当表发生特定事件时激活。 触发器的一些用途是对要插入表中的值执行检查或对更新中涉及的值执行计算。

触发器也是一种存储程序,它和一个指定的表相关联,当该表中的数据发生变化(增加、更新、删除)时自动执行。 这些修改数据行的操作被称为触发器事件,例如 INSERT 或者 LOAD DATA 等插入数据的语句可以激活插入触发器。触发器可以设置为在触发事件之前或之后激活。 例如,您可以在插入表中的每行之前或更新每行之后激活触发器。

通过编写触发器,你可以实现数据的验证、记录变更、数据同步等操作。触发器是数据库中强大的功能之一,可以在保持数据完整性和一致性方面发挥重要作用。

按照 SQL 标准,触发器可以分为行级触发器(row-level trigger)和语句级触发器( statement-level trigger)。行级触发器对于修改的每一行数据都会激活一次,如果一个语句插入了 100 行数据,将会调用触发器 100 次;语句级触发器针对每个语句激活一次,一个插入 100 行数据的语句只会调用一次触发器。

MySQL 只支持行级触发器,不支持预语句级触发器。

在 MySQL 中,只有执行增加、更新和删除操作时才能触发触发器的执行。

不同事件可以激活不同类型的触发器。

  • INSERT 事件触发器用于插入数据的操作,包括 INSERT、LOAD DATA、REPLACE 语句等。
  • UPDATE 事件触发器用于更新操作,例如 UPDATE 语句。
  • DELETE 事件触发器用于删除操作,例如 DELETE 和 REPLACE 语句等。

DROP TABLE 和 TRUNCATE TABLE 语句不会激活删除触发器。

另外,MySQL 触发器可以在触发事件之前或者之后执行,分别称为 BEFORE 触发器和 AFTER 触发器。这两种触发时机可以和不同的触发事件进行组合,例如 BEFORE INSERT 触发器或者 AFTER UPDATE 触发器。

MySQL 触发器的优点包括:

  • 记录并审核用户对表中数据的修改操作,实现审计功能。
  • 实现比检查约束更复杂的完整性约束,例如禁止非业务时间的数据操作。
  • 实现某种业务逻辑,例如增加或删除员工时自动更新部门中的人数。
  • 实时同步表中的数据。

虽然触发器功能强大,但是它也存在一些缺点:

  • 触发器会增加数据库结构的复杂度,而且触发器对应用程序不可见,难以调试。
  • 触发器需要占用更多的数据库服务器资源,尽量使用数据库提供的非空、唯一、检查约束等。
  • 触发器不能接收参数,只能基于当前的触发对象进行操作。

针对特殊场景使用触发器可以带来一定的便利性,但不要过渡依赖触发器,避免造成数据库的性能下降和维护困难。接下来我们介绍触发器的管理操作。

语法

MySQL 使用 CREATE TRIGGRT 语句创建触发器。

CREATE    [DEFINER = user]    TRIGGER [IF NOT EXISTS] trigger_name    trigger_time trigger_event    ON tbl_name FOR EACH ROW    [trigger_order]    trigger_bodytrigger_time: { BEFORE | AFTER }trigger_event: { INSERT | UPDATE | DELETE }trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

DEFINER 子句是可选的,用于指定触发器的创建者或所有者。它定义了谁有权利执行和管理这个触发器。具体来说,DEFINER 子句决定了触发器在哪个数据库用户的权限下运行。

如果存在 DEFINER 子句,则用户值应为指定为 ‘user_name’@‘host_name’、CURRENT_USER 或 CURRENT_USER() 的 MySQL 帐户,允许的用户值取决于您拥有的权限。缺省为当前执行创建操作的用户。

trigger_name 是触发器的名称。

trigger_time 指定触发器的触发时机,在触发事件之前(BEFORE )还是之后(AFTER)执行。

trigger_event 用于定义触发事件的类型 INSERT、UPDATE 还是 DELETE。

table_name 是触发器关联的表名,不能是临时表或者视图。

FOR EACH ROW 表明这是一个行级触发器。

trigger_order 是可选的,用于指定与其他具有相同触发事件和动作时间的现有触发器的先后触发关系。如果没有指定任何选项,默认情况下按照触发器的创建顺序执行。

trigger_body 是触发器执行的具体语句。

在触发器主体中,您可以通过使用别名 OLD 和 NEW 来引用主题表(与触发器关联的表)中的列。OLD.col_name 引用更新或删除之前的现有行的列。NEW.col_name 是指要插入的新行或更新后的现有行的列。

示例

下面是一个简单的示例,它将触发器与表关联起来,以激活 INSERT 操作。 触发器充当累加器,对插入表的某一列中的值求和。

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));Query OK, 0 rows affected (0.03 sec)mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account       FOR EACH ROW SET @sum = @sum + NEW.amount;Query OK, 0 rows affected (0.01 sec)

上面创建了一个名为 ins_sum 的触发器,该触发器与 ins_sum 表关联。 它还指定了触发器动作时间(BEFORE)、触发事件(INSERT)以及触发器激活时执行的操作的子句。

要使用触发器,请将累加器变量设置为零,执行 INSERT 语句,然后查看变量的值。

mysql> SET @sum = 0;mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);mysql> SELECT @sum AS 'Total amount inserted';+-----------------------+| Total amount inserted |+-----------------------+|               1852.48 |+-----------------------+

使用 SHOW TRIGGERS 语句可以查看数据库中的触发器列表。

SHOW TRIGGERS    [{FROM | IN} db_name]    [LIKE 'pattern' | WHERE expr]

db_name 用于查看指定数据库中的触发器,默认为当前数据库。

LIKE 子句(如果存在)指示要匹配的表名称(不是触发器名称),显示这些表的触发器。

可以使用 WHERE 子句来使用更通用的条件筛选。

比如查看上面创建的触发器 ins_sum。

mysql> SHOW TRIGGERS LIKE 'acc%'\G*************************** 1. row ***************************             Trigger: ins_sum               Event: INSERT               Table: account           Statement: SET @sum = @sum + NEW.amount              Timing: BEFORE             Created: 2023-08-24 10:10:12.61            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,                      NO_ZERO_IN_DATE,NO_ZERO_DATE,                      ERROR_FOR_DIVISION_BY_ZERO,                      NO_ENGINE_SUBSTITUTION             Definer: me@localhostcharacter_set_client: utf8mb4collation_connection: utf8mb4_0900_ai_ci  Database Collation: utf8mb4_0900_ai_ci

另外,MySQL 系统表 INFORMATION_SCHEMA.TRIGGERS 中包含了更详细的触发器信息。

如果想要获取创建某个触发器的 DDL 语句,可以 SHOW CREATE TRIGGER 语句。

mysql> SHOW CREATE TRIGGER ins_sum\G*************************** 1. row ***************************               Trigger: ins_sum              sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,                        NO_ZERO_IN_DATE,NO_ZERO_DATE,                        ERROR_FOR_DIVISION_BY_ZERO,                        NO_ENGINE_SUBSTITUTIONSQL Original Statement: CREATE DEFINER=`me`@`localhost` TRIGGER `ins_sum`                        BEFORE INSERT ON `account`                        FOR EACH ROW SET @sum = @sum + NEW.amount  character_set_client: utf8mb4  collation_connection: utf8mb4_0900_ai_ci    Database Collation: utf8mb4_0900_ai_ci               Created: 2023-08-24 10:10:12.61

MySQL 没有提供修改触发器的语句,只能通过 DROP TRIGGER 语句删除并再次创建触发器。

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

该语句会删除一个触发器。 模式(数据库)名称是可选的。 如果省略模式,则会在当前的数据库中查找并删除触发器。DROP TRIGGER 需要与触发器关联的表的 TRIGGER 权限。

IF EXISTS 可以避免触发器 tri_audit_salary 不存在时产生错误。

例如,以下语句可以用于删除触发器 ins_sum。

DROP TRIGGER IF EXISTS ins_sum;

MySQL 8.0 Reference Manual :: 25 Stored Objects
MySQL 8.0 Reference Manual :: 25.3 Using Triggers
13.1.22 CREATE TRIGGER Statement
13.7.7.40 SHOW TRIGGERS Statement
13.7.7.11 SHOW CREATE TRIGGER Statement
13.1.34 DROP TRIGGER Statement
《MySQL 入门教程》第 33 篇 触发器

来源地址:https://blog.csdn.net/K346K346/article/details/132425387

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL 触发器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL 触发器

文章目录 1.简介2.行级与语句级触发器3.触发时机4.触发器优缺点5.创建触发器语法示例 6.查看触发器7.删除触发器参考文献 1.简介 触发器(Trigger)是与表关联的命名数据库对象,当表发生特定事件时激活。 触发器
2023-08-30

MySQL触发器

1、 触发器定义:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delet
MySQL触发器
2019-06-10

MySQL——触发器

基本语法 //创建触发器CREATE TRIGGER name//删除触发器DROP TRIGGER name 创建触发器 在创建触发器时需要给出4条信息 唯一的触发器名 触发器需要关联的表 触发器应该响应的活动(DELETE、INSTERT或UPDA
MySQL——触发器
2020-02-06
2024-04-02

mysql触发器的三种触发事件

mysql触发器在特定事件发生时执行动作,有三种触发事件:1. before:在操作发生前触发,允许检查数据或更新其他表;2. after:在操作发生后触发,允许发送通知或分析数据;3. instead of:替代操作,允许完全控制对表的修
mysql触发器的三种触发事件
2024-08-01

Mysql中的触发器

阅读目录什么是触发器特点及作用例子:创建触发器,记录表的增、删、改操作记录弊端什么是触发器简单的说,就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行;特点及作用特点:触发事件的操作和触发器里的SQL语句是一个事务
Mysql中的触发器
2018-09-20

如果 MySQL 中存在触发器,则删除触发器?

要删除触发器,请使用DROP命令。语法如下 −DROP TRIGGER IF EXISTS yourTriggerName;为了理解上述语法,您需要在当前数据库中有一个触发器。要检查触发器是否存在,您可以使用以下查询。我们的数据库中有一个触
2023-10-22

mysql触发器有几种

mysql提供两种类型的触发器:行级和语句级。行级触发器在单个行操作(插入、更新、删除)时触发,可分为 before、after、instead of 三种;语句级触发器在多行操作(insert、update、delete、merge)时触
mysql触发器有几种
2024-08-02

mysql触发器的作用

触发器是一种数据库对象,可在表上的特定事件(插入、更新或删除)发生时自动执行 sql 语句。其作用包括:维护数据完整性,确保表中数据符合特定规则自动执行任务,如发送电子邮件、更新其他表实现复杂的业务逻辑提高性能,避免重复执行相同任务MySQ
mysql触发器的作用
2024-08-06

MYSQL触发器的使用

概念:触发器是一种特殊的储存过程,在满足定义条件操作时触发,并且自动执行触发器中预先设定好的定义的语句集合触发器是特殊的储存过程触发器是在对表操作时,满足条件就可以自动调用预先编译的sql语句安全性 可以基于数据库的值使用户具有操作数据库的某种权利审计 可以跟
MYSQL触发器的使用
2021-10-21

mysql触发器怎么用

这篇文章给大家分享的是有关mysql触发器怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。说明1、触发器也是存储过程程序的一种,而触发器内部的执行SQL语句是可以多行操作的。2、在MySQL的存储过程程序中,
2023-06-20

MySQL触发器之初见

触发器语法CREATE TRIGGER trigger_nametrigger_timetrigger_event NO table_nameFOR EACH ROWtrigger_stmttrigger_name: 标识触发器名称,用户自行指定;trigg
2014-11-27

编程热搜

目录