暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL触发器简介

原创 只是甲 2020-06-10
1775

备注:测试数据库版本为MySQL 8.0

这个blog我们来聊聊MySQL触发器。
触发器是在表中数据发生更改时自动触发执行的,特殊的存储过程。
存储过程是手工进行调用的,触发器是自动的。
当然,对于频繁更新或数据量比较大的表,慎用触发器,在一定程度上,会影响性能。

一.语法相关

触发器语法:

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

BEFORE – 在触发时间之前执行操作
AFTER – 在触发时间之后执行操作

FOR EACH ROW – 操作影响的每一行都会做执行一次触发程序

NEW – 标记新纪录,例如NEW.ID 表示表中新数据行的ID
OLD – 标记旧纪录,例如OLD.ID 表示表中旧数据行的ID

二.案例相关

需求: 对于用户表,进行删除的数据,都把历史数据保留到历史表中

测试数据:

create table user_info(id int not null auto_increment,name varchar(200),id_number varchar(50),primary key(id)); insert into user_info values (1,'张三','420123199001011234'); insert into user_info values (2,'李四','420123199001011235'); insert into user_info values (3,'王五','420123199001011236'); -- 用户历史数据表 create table user_info_history(id int not null auto_increment,type varchar(50),user_id int,name varchar(200),id_number varchar(50),primary key(id));

触发器代码:

delimiter // create trigger trg_del_userinfo before delete on user_info for each row begin insert into user_info_history(user_id,name,id_number,create_time) select old.id,old.name,old.id_number,now(); end; // delimiter ;

执行结果:

mysql> delimiter // mysql> mysql> create trigger trg_del_userinfo before delete on user_info -> for each row -> begin -> -> insert into user_info_history(user_id,name,id_number,create_time) -> select old.id,old.name,old.id_number,now(); -> -> end; -> -> // Query OK, 0 rows affected (0.01 sec) mysql> mysql> delimiter ; mysql> mysql> mysql> select * from user_info; +----+--------+--------------------+ | id | name | id_number | +----+--------+--------------------+ | 1 | 张三 | 420123199001011234 | | 2 | 李四 | 420123199001011235 | | 3 | 王五 | 420123199001011236 | +----+--------+--------------------+ 3 rows in set (0.00 sec) mysql> select * from user_info_history; Empty set (0.00 sec) -- 执行删除操作 mysql> delete from user_info where id = 1; Query OK, 1 row affected (0.00 sec) -- 查询user_info表,发现数据被删除 mysql> select * from user_info; +----+--------+--------------------+ | id | name | id_number | +----+--------+--------------------+ | 2 | 李四 | 420123199001011235 | | 3 | 王五 | 420123199001011236 | +----+--------+--------------------+ 2 rows in set (0.00 sec) -- 查询历史表,已经保留了历史数据,触发器是自动触发的,无需手工调用 mysql> select * from user_info_history; +----+------+---------+--------+--------------------+---------------------+ | id | type | user_id | name | id_number | create_time | +----+------+---------+--------+--------------------+---------------------+ | 1 | NULL | 1 | 张三 | 420123199001011234 | 2020-05-25 22:26:54 | +----+------+---------+--------+--------------------+---------------------+ 1 row in set (0.00 sec) mysql>
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论