博客
关于我
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 幻读(Phantom Problem)不可重复读
查看>>
mysql 往字段后面加字符串
查看>>
mysql 快速自增假数据, 新增假数据,mysql自增假数据
查看>>
Mysql 批量修改四种方式效率对比(一)
查看>>
Mysql 报错 Field 'id' doesn't have a default value
查看>>
MySQL 报错:Duplicate entry 'xxx' for key 'UNIQ_XXXX'
查看>>
Mysql 拼接多个字段作为查询条件查询方法
查看>>
mysql 排序id_mysql如何按特定id排序
查看>>
Mysql 提示:Communication link failure
查看>>
mysql 插入是否成功_PDO mysql:如何知道插入是否成功
查看>>
Mysql 数据库InnoDB存储引擎中主要组件的刷新清理条件:脏页、RedoLog重做日志、Insert Buffer或ChangeBuffer、Undo Log
查看>>
mysql 数据库中 count(*),count(1),count(列名)区别和效率问题
查看>>
mysql 数据库备份及ibdata1的瘦身
查看>>
MySQL 数据库备份种类以及常用备份工具汇总
查看>>
mysql 数据库存储引擎怎么选择?快来看看性能测试吧
查看>>
MySQL 数据库操作指南:学习如何使用 Python 进行增删改查操作
查看>>
MySQL 数据库的高可用性分析
查看>>
MySQL 数据库设计总结
查看>>
Mysql 数据库重置ID排序
查看>>
Mysql 数据类型一日期
查看>>