MySQL触发器
准备代码:

CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci; use shop; CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `add_time` TIMESTAMP DEFAULT NOW(), PRIMARY KEY (`id`), KEY `name` (`name`(250)) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb3 ROW_FORMAT=COMPACT; CREATE TABLE `logs` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `log` varchar(255) DEFAULT NULL COMMENT '日志说明', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb3 COMMENT='日志表';
1.什么是触发器
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。
2.创建触发器
(1)语法:
CREATE TRIGGER <trigger_name>
BEFORE|AFTER
INSERT|UPDATE|DELETE ON <table_name> #表名
FOR EACH ROW
BEGIN
<触发的SQL语句>(调用NEW/OLD参数);
END
参数说明:
1>CREATE TRIGGER <trigger_name> --- 触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
2>{ BEFORE | AFTER } --- 触发器触发时间设置:可以设置为事件发生前或后(前:一般用于校验;后:一般用于关联)。
3>{ INSERT | UPDATE | DELETE } -- 设定触发事件:如执行insert、update或delete的过程时激活触发器。
触发器类型 | 触发器功能 | 激活触发器的语句 |
---|---|---|
INSERT触发器 | 将新行插入表时激活触发器。 | INSERT ,LOAD, DATA ,REPLACE |
DELETE触发器 | 从表中删除某一行数据时激活触发器。 | DELETE ,REPLACE |
UPDATE触发器 | 更改表中某一行数据时激活触发器。 | DELETE |
4>ON <table_name> --- 触发器是属于某一个表的: 当在这个表上执行 INSERT|UPDATE|DELETE 操作的时候就导致触发器的激活. 同时,我们不能给同一张表的“同一个事件”安排两个触发器(意味着不能同时有两个Insert触发器)。
5>FOR EACH ROW --- 触发器的执行间隔(必有的公式内容):FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
6><触发的SQL语句> --- 触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。当然,触发SQL中可以调用“触发了( INSERT | UPDATE | DELETE )触发器的那一行数据”。
注意:每个表都支持 INSERT、UPDATE 和 DELETE 的 BEFORE 与 AFTER,因此每个表最多支持 6 个触发器。每个表的每个事件每次只允许有一个触发器。单一触发器不能与多个事件或多个表关联。
(2).NEW和OLD的使用(转自:https://www.cnblogs.com/zh-1721342390/p/9602941.html)
根据以上的表格,可以使用一下格式来使用相应的数据:
NEW.columnname:新增行的某列数据 OLD.columnname:删除行的某列数据
例1:创建一个名为 user_log的触发器,触发的条件是向数据表users 中插入数据之后,再向logs表中的log字段写入新插入行的name字段+“is created”信息。
drop TRIGGER if EXISTS user_log; DELIMITER $ CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW BEGIN DECLARE s1 VARCHAR(40)character set utf8mb3; DECLARE s2 VARCHAR(20) character set utf8mb3; SET s2 = " is created"; SET s1 = CONCAT(NEW.name,s2);#函数CONCAT可以将字符串连接 INSERT INTO logs(log) values(s1); END $ DELIMITER ; insert into users(`name`,`add_time`) values('小明','2022/12/12'); select * from users; select * from logs;
结果如下:
3.查看触发器
SHOW TRIGGERS;
SHOW TRIGGERS 语句用来查看当前创建的所有触发器的信息。因为该语句无法查询指定的触发器,所以在触发器较少的情况下,使用该语句会很方便。如果要查看特定触发器的信息或者数据库中触发器较多时,可以直接从 information_schema 数据库中的 triggers 数据表中查找。
在triggers表中查看触发器信息
在 MySQL 中,所有触发器的信息都存在 information_schema 数据库的 triggers 表中,可以通过查询命令 SELECT 来查看,具体的语法如下:
SELECT * FROM information_schema.triggers WHERE trigger_name= '触发器名';
例:使用select命令查看user_log触发器的信息。
SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME= 'user_log';
4.修改和删除触发器(转自:http://c.biancheng.net/view/2601.html)
修改触发器可以通过删除原来的触发器,再创建相同名称的触发器。
删除触发器的语法:DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名>
语法说明如下:
1) 触发器名
要删除的触发器名称。
2) 数据库名
可选项。指定触发器所在的数据库的名称。若没有指定,则为当前默认的数据库。
3) 权限
执行 DROP TRIGGER 语句需要 SUPER 权限。
4) IF EXISTS
可选项。避免在没有触发器的情况下删除触发器。
注意:删除一个表的同时,也会自动删除该表上的触发器。另外,触发器不能更新或覆盖,为了修改一个触发器,必须先删除它,再重新创建。
参考文章:
http://c.biancheng.net/view/2601.html
https://www.cnblogs.com/zh-1721342390/p/9602941.html
https://zhuanlan.zhihu.com/p/158670286
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?