数据库的触发器你了解多少

简介: 触发器是与表有关的数据库对象,指的是在insert\update\delete操作之前或者之后,能够触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以使得应用在数据库端确保数据的完整性以及日志记录,数据校验等操作。

一、概念


触发器是与表有关的数据库对象,指的是在insert\update\delete操作之前或者之后,能够触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以使得应用在数据库端确保数据的完整性以及日志记录,数据校验等操作。


并且可以使用OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是类似的,但是现在的触发器只支持行级触发,并不支持语句级触发。


触发器类型
NEW和OLD的使用
insert
new表示将要或者已经插入的数据,没有old值
update  old表示更新之前的数据,new表示将要或者已经更新后的数据
delete  old表示将要或者已经删除的数据,没有new值


二、相关操作


1、触发器的创建


创建触发器的语法结构:


create trigger trigger_name
before/after insert/update/delete
on table_name
[for each row] --- 行级触发器
begin
   trigger_stmt;
end;
复制代码


通过触发器来记录数据表的数据变化(新增insert、修改update、删除delete)记录。


首先创建一个employee表,并插入数据:


DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `lastName` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `departmentID` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
-- ----------------------------
INSERT INTO `employee` VALUES ('1', '亚索', '123qq.com', '201');
INSERT INTO `employee` VALUES ('2', '李青', '12345@qq.com', '201');
INSERT INTO `employee` VALUES ('3', '剑圣', '2354@qq.com', '202');
INSERT INTO `employee` VALUES ('4', '嘉文', '6565@qq.com', '203');
复制代码


b29110d8e40a4252994307cef8a3ef73~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


然后再创建一个日志表来记录employee表进行insert\update\delete操作的时候的日志情况。


create table emplog(
id int(11) not null auto_increment primary key,
operation varchar(20) not null comment '操作类型:insert?update/delete'
,
operate_time datetime not null comment '操作时间',
operate_id int(11) not null comment '操作表的id',
operate_params varchar(500) comment '操作参数'
)engine=innodb default charset=utf8;
复制代码


5935ff85568a491088eb3ea3ce63f85f~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


创建insert_trigger触发器记录insert操作的记录,delimiter就是告诉mysql解释器,该段命令是否已经结束了,是否可以执行了。默认情况下,delimiter是分号,遇到分号就执行。但是在触发器中的sql语句中也用到了;与触发器的语句结束冲突,所以这里使用delimiter命令将 delimiter设置为$:


delimiter $
create trigger insert_trigger
after insert
on employee
for each row
begin
  insert into emplog(id,operation,operate_time,operate_id,operate_params)
  values
  (null,'insert',now(),new.id,concat('插入后(id:',new.id,',lastname:',new.lastname,',email:',new.email,',departmentID:',new.departmentID,')'));
end$
复制代码


71378515bd754f6daf98d79463d38b7e~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


接下来向employee表中插入一条数据,并查询emplog日志表:


INSERT INTO `employee` VALUES ('5', '艾欧尼亚', '774855@qq.com', '203')¥
select * from emplog$
复制代码


插入数据的记录已经通过触发器记录在了emplog日志表中:


47a8e4c6aa974fb8a67486255c6241e2~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


接下来创建一个update触发器,记录更新操作的记录:


create trigger ipdate_trigger
after update
on employee
for each row
begin
  insert into emplog(id,operation,operate_time,operate_id,operate_params)
  values
  (null,'update',now(),new.id,concat(
  '更新前:(id:',old.id,',lastname:',old.lastname,',email:',old.email,',departmentID:',old.departmentID,'),
   更新后(',new.id,',lastname:',new.lastname,',email:',new.email,',departmentID:',new.departmentID));
end$
复制代码


update employee set lastname='厄斐琉斯' where id=3$
 select * from emplog$
复制代码


d872875530ee4b298ecd1dc922b44cd8~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


delete触发器的创建:


create trigger delete_trigger
after delete
on employee
for each row
begin
  insert into emplog(id,operation,operate_time,operate_id,operate_params)
  values
  (null,'delete',now(),old.id,concat('删除前(id:',old.id,',lastname:',old.lastname,',email:',old.email,',departmentID:',old.departmentID,')'));
end$
复制代码


delete from employee where id=3$
 select * from emplog$
复制代码


ecbf6a9a8e514f57a7e7ab52285c1baa~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


上面就是如何关于触发器的创建以及使用。


2、触发器的查看


如果想要查看自己创建了哪些触发器,可以通过show triggers命令查看触发器的相关信息。


show triggers$
show triggers\G$
复制代码


\G表示:将查询到的横向表格纵向输出方便查看


bd642043ad3e411690c20a8fd362bfe7~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


53d63ade24864a70bc4dca1a55dd02c4~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


3、触发器的删除


如果需要删除触发器可以通过执行命令:


drop trigger [database_name] trigger_name
database_name为选填条件,如果没有指定数据库,则默认为当前使用的数据库
复制代码


执行 drop trigger insert_trigger命令后:


edcb1ae9ae3f49da88a8e8a68e8b4283~tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.webp.jpg


以上就是关于触发器的基本使用的介绍。


有任何问题或者不正确的地方欢迎讨论指正!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
存储 SQL 数据挖掘
视图、触发器和存储过程:提升数据库功能
视图、触发器和存储过程:提升数据库功能
19 1
|
2月前
|
存储 SQL 关系型数据库
【MySQL 数据库】10、MySQL 的触发器
【MySQL 数据库】10、MySQL 的触发器
23 0
|
9月前
|
存储 SQL 关系型数据库
MySQL存储过程与触发器:提升数据库操作效率与数据一致性
本文深入探讨了MySQL数据库中的存储过程与触发器,通过丰富的代码示例,详细介绍了存储过程的定义与调用、参数与变量的应用,以及触发器的创建、使用和实际案例。存储过程作为预定义的一组SQL语句,能够提高数据库操作的效率,实现数据逻辑和复杂计算。同时,触发器作为在特定事件触发时自动执行的SQL语句,能够保障数据一致性和逻辑完整性。通过代码实例,读者将了解如何创建、调用存储过程,如何利用参数和变量进行数据处理,以及如何创建触发器并应用于实际场景。这些技术将使读者能够在数据库管理中更高效地进行操作和保障数据的完整性,为应用程序提供可靠的数据支持。
207 0
|
10月前
|
存储 SQL 安全
数据库SQL Server 9-10 章(存储过程与触发器)
数据库SQL Server 9-10 章(存储过程与触发器)
155 0
|
5月前
|
存储 SQL 定位技术
数据库基础(五):存储过程与触发器的创建、执行、修改、删除
数据库基础(五):存储过程与触发器的创建、执行、修改、删除
|
10月前
|
存储 SQL 数据库
数据库视频第十章触发器
数据库视频第十章触发器
|
5月前
|
SQL 存储 关系型数据库
Mysql数据库 13.SQL语言 触发器
Mysql数据库 13.SQL语言 触发器
56 0
|
8月前
|
存储 SQL Oracle
数据库中存储过程和触发器有什么区别?
数据库中存储过程和触发器有什么区别?
112 0
|
9月前
|
存储 SQL 关系型数据库
数据库触发器
数据库触发器
115 0
|
10月前
|
存储 SQL 监控
MySQL数据库,从入门到精通:第十七篇——MySQL 触发器的使用方法及注意事项
MySQL数据库,从入门到精通:第十七篇——MySQL 触发器的使用方法及注意事项
152 0