博客
关于我
MySQL 触发器
阅读量:795 次
发布时间:2023-02-11

本文共 1592 字,大约阅读时间需要 5 分钟。

MySQL触发器是数据库对象,用于在特定表操作事件发生时自动执行指定的SQL语句。以下是关于MySQL触发器的详细指南。

创建触发器

触发器的创建语法如下:

CREATE TRIGGER trigger_name trigger_time ON tbl_name FOR EACH ROW trigger_stmt
  • trigger_name:用户自定义的触发器名称。
  • trigger_time:触发时机,可选值为 BEFOREAFTER
  • tbl_name:触发器所属的表名。
  • trigger_stmt:触发器执行的SQL语句或代码块,支持多行使用 BEGIN...END 包裹。

支持以下6种触发事件:

  • BEFORE INSERT:插入新记录前触发。
  • BEFORE UPDATE:更新记录前触发。
  • BEFORE DELETE:删除记录前触发。
  • AFTER INSERT:插入新记录后触发。
  • AFTER UPDATE:更新记录后触发。
  • AFTER DELETE:删除记录后触发。

同一表最多可创建6个触发器,且不能同时存在相同类型的触发器。

触发事件详解

除了基本的 INSERTUPDATEDELETELOAD DATAREPLACE 语句也能触发触发器。这些语句在执行时,会根据操作类型激活相应的触发器。

  • LOAD DATA:从文件中加载数据,类似多个 INSERT 操作。
  • REPLACE:类似 INSERT,但在主键或唯一索引存在时,先删除旧记录再插入新记录。
  • INSERT:直接插入新记录。

BEGIN...END 详解

BEGIN...END 语法用于包裹触发器体,语法如下:

BEGIN[statement_list]END
  • statement_list:包含一系列SQL语句,每条语句用分号结尾。
  • 为了避免解释器误解分号,建议使用 DELIMITER 定义其他分隔符。

定义分隔符

修改默认分隔符:

DELIMITER $

使用后,语句结尾用 $ 结束,修改后需恢复默认:

DELIMITER ;

完整示例

假设有两个表:classstudent,目标是自动更新班级学生数。

DELIMITER $CREATE TRIGGER tri_stuInsert AFTER INSERT ON student FOR EACH ROWBEGIN    declare c int;    set c = (select stuCount from class where classID = new.classID);    update class set stuCount = c + 1 where classID = new.classID;END$DELIMITER ;

变量定义

使用 DECLARE 定义局部变量,仅在 BEGIN...END 内可用,语法如下:

DECLARE var_name[,...] type [DEFAULT value]

赋值使用 SET 语句:

SET var_name = expr

NEW 和 OLD

  • NEW:表示新增或修改的数据,在 INSERTUPDATE 触发器中可写。
  • OLD:表示被修改或删除的原数据,在 UPDATEDELETE 触发器中可读。

查看触发器

查看触发器的语法:

SHOW TRIGGERS [FROM schema_name];

删除触发器

删除触发器的语法:

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

执行顺序

  • BEFORE 触发器失败:后续操作无法执行。
  • AFTER 触发器执行失败:事务回滚。
  • 事务性表:确保数据一致性,失败时回滚。

通过以上方法,可以灵活配置数据库触发器,提升数据管理效率。

转载地址:http://wdbfk.baihongyu.com/

你可能感兴趣的文章
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>
MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
查看>>
MySQL万字总结!超详细!
查看>>
Mysql下载以及安装(新手入门,超详细)
查看>>
MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
查看>>
MySQL不同字符集及排序规则详解:业务场景下的最佳选
查看>>
Mysql不同官方版本对比
查看>>
MySQL与Informix数据库中的同义表创建:深入解析与比较
查看>>
mysql与mem_细说 MySQL 之 MEM_ROOT
查看>>
MySQL与Oracle的数据迁移注意事项,另附转换工具链接
查看>>
mysql丢失更新问题
查看>>
MySQL两千万数据优化&迁移
查看>>
MySql中 delimiter 详解
查看>>