博客
关于我
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
查看>>
MTK Android 如何获取系统权限
查看>>
MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>
MySQL - ERROR 1406
查看>>
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
MTTR、MTBF、MTTF的大白话理解
查看>>
mt_rand
查看>>
mysql /*! 50100 ... */ 条件编译
查看>>
mudbox卸载/完美解决安装失败/如何彻底卸载清除干净mudbox各种残留注册表和文件的方法...
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>