IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> 【MySQL】触发器 -> 正文阅读

[大数据]【MySQL】触发器

触发器

1 介绍

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

在触发器的SQL语句集合中,我们可以使用OLD和NEW来引用即将被或已经被insert/update/delete的数据,在这一点上,MySQL数据库与其他的数据库是相似的,但是MySQL的触发器现在还只支持行级触发,不支持语句级触发,行级触发指当我们执行一条SQL语句时,对多少行数据产生了影响,就会触发多少次触发器,而语句级触发指执行一条SQL语句无论对多少行数据产生了影响,都只会触发一次。

触发器类型NEW OLD
INSERT 型触发器NEW 表示将要或者已经新增的数据
UPDATE 型触发器OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据
DELETE 型触发器OLD 表示将要或者已经删除的数据

2 语法

1.创建触发器

CREATE TRIGGER trigger_name 
BEFORE/AFTER INSERT/UPDATE/DELETE -- 指定对何种类型的语句触发,以及执行前还是执行后触发
ON tbl_name FOR EACH ROW -- 指定表名,并指定当前触发器为行级触发器(只有这个选项) 
BEGIN
	trigger_stmt ; -- 编写触发器执行后所执行的语句
END;

2.查看触发器

SHOW TRIGGERS ;

3.删除触发器

DROP TRIGGER [schema_name.]trigger_name ; -- 如果没有指定 schema_name,默认为当前数据库 。

3 案例

通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表user_logs中,包含增加,修改, 删除 ;

表结构准备:

tb_user

create table tb_user( 
    id int primary key auto_increment comment '主键', 
    name varchar(50) not null comment '用户名', 
    phone varchar(11) not null comment '手机号', 
    email varchar(100) comment '邮箱', 
    profession varchar(11) comment '专业', 
    age tinyint unsigned comment '年龄', 
    gender char(1) comment '性别 , 1: 男, 2: 女', 
    status char(1) comment '状态', 
    createtime datetime comment '创建时间' 
) comment '系统用户表';

user_logs

-- 准备工作:日志表 user_logs
create table user_logs( 
    id int(11) not null auto_increment, 
    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 '操作参数', 
    primary key(`id`) 
)engine=innodb default charset=utf8;

1.插入数据触发器

create trigger tb_user_insert_trigger
after insert on tb_user for each row
begin
    insert into user_logs(id, operation, operate_time, operate_id, operate_params)
    -- 可以通过'new.字段名'获取即将插入的数据的字段值
    VALUES(null, 'insert', now(), new.id, 
           concat('插入的数据内容为: id=',new.id,',name=',new.name,', phone=', new.phone,
                                  ', email=', new.email, ', profession=', new.profession
                 )
          );
end;

测试

-- 查看触发器是否已经创建
show triggers ;

-- 插入数据
insert into tb_user(id, name, phone, email, profession, age, gender, status, createtime) VALUES (26,'三皇子','18809091212','erhuangzi@163.com','软件工程',23,'1','1',now());

当我们在tb_user中插入一条数据后,触发器会被触发,同时往user_logs表中也插入一条数据:

在这里插入图片描述

2.修改数据触发器

create trigger tb_user_update_trigger
after update on tb_user for each row
begin
    insert into user_logs(id, operation, operate_time, operate_id, operate_params)
    VALUES(null, 'update', now(), new.id,
           -- 可以通过'old.字段名'获取即将被更新的数据的字段值,通过'new.字段名'获取更新后的数据的字段值
           concat('更新之前的数据: id=',old.id,',name=',old.name, ', phone=', old.phone, 
                                ', email=', old.email, ', profession=', old.profession,  
                  '|更新之后的数据: id=',new.id,',name=',new.name, ', phone=', NEW.phone, 
                                ', email=', new.email, ', profession=', new.profession
                 )
          );
end;

测试

-- 查看
show triggers ;
-- 更新
update tb_user set profession = '会计' where id = 23;
update tb_user set profession = '会计' where id <= 5;

这里更新了多条数据,由于mysql中的触发器只支持行级触发,因此会在user_logs插入多条更新记录

在这里插入图片描述

3.删除数据触发器

create trigger tb_user_delete_trigger
after delete on tb_user for each row
begin
    insert into user_logs(id, operation, operate_time, operate_id, operate_params)
    VALUES(null, 'delete', now(), old.id,
           -- 可以通过'old.字段名'获取即将被删除的数据的字段值
           concat('删除之前的数据: id=',old.id,',name=',old.name, ', phone=', old.phone,
                                ', email=', old.email, ', profession=', old.profession
                  )
           );
end;

测试

-- 查看 
show triggers ; 
-- 删除数据 
delete from tb_user where id = 26;

再查看user_logs表,可以发现删除记录也被添加进去了
在这里插入图片描述

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:22:43  更:2022-09-13 11:26:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:28:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码