MySQL-触发器

介绍

触发器是一个与表有关的数据库对象,能够在insert、update、delete后,触发并执行触发器中定义的SQL语句集合。可以协助应用在数据库端确保数据的完整性,日志查询,数据校验

使用OLD、NEW来引用触发器中发生变化的记录内容。现在的触发器还只是行级触发器,不支持语句级触发器。

  • 行级触发: 假设一条SQL语句影响了多行数据,触发器将被多次触发
  • 语句级触发器:不管一行SQL语句影响了多少行数据,只被触发一次

基本语法

  • 触发器的创建

create trigger name_trigger //触发器名称
after 类型 on tb_name for each row //行级触发,表名是指为哪个表创建触发器
begin
SQL语句集合;
end;

  • 触发器的查看

    show triggers;

  • 触发器的删除

drop trigger name_trigger; //触发器名称

案例

  • insert类型

我想为users表的 insert 语句,创建一个触发器 user_insert_trigger ,并将日志记录在表user_logs 中

先创建一张表来记录日志

复制代码
create table user_logs(
    id int not null auto_increment,
    operation varchar(10) comment '操作类型',
    operate_time datetime comment '操作时间',
    operate_id int(11) not null comment '操作的id',
    operate_params varchar(500) comment '操作参数',
    primary key(`id`)
)engine=innodb default charset = utf8;

然后创建触发器

复制代码
create trigger users_insert_trigger
    after insert on users for each row
begin
    insert into user_logs(id, operation, operate_time, operate_id, operate_params) values
    (null,'insert',now(),NEW.user_id,concat('插入的数据内容为:',NEW.user_id,' name=',NEW.user_name,' address=',NEW.user_address));
end;

然后现在往 users 表中 insert 一条数据,看看是否成功将插入操作日志记录在刚才创建的日志表中

复制代码
 users values(53,'小昭','女','21','1112223334','北京市海淀区');

我来查看一下日志表

确实刚才的插入操作被记录在了日志表中。

  • update类型

我们同样将更新的日志放在前面创建的日志表中

复制代码
create trigger users_update_trigger
    after update on users for each row
begin
    insert into user_logs(id, operation, operate_time, operate_id, operate_params) values
    (null,'update',now(),NEW.user_id,concat
    ('更新前的数据:',OLD.user_id,' name=',OLD.user_name,' address=',OLD.user_address,
     '更新后的数据:',NEW.user_id,' name=',NEW.user_name,' address=',NEW.user_address));
end;

查看已有的触发器

复制代码
show triggers;

然后更新users表中的数据,然后查看日志表有没有新的记录

复制代码
update users set user_name='赵无极' where user_id = 1;
  • delete类型

    create trigger users_delete_trigger
    after delete on users for each row
    begin
    insert into user_logs(id, operation, operate_time, operate_id, operate_params) values
    (null,'delete',now(),OLD.user_id,concat
    ('删除的数据为:',OLD.user_id,' name=',OLD.user_name,' address=',OLD.user_address));
    end;

    delete from users where user_id = 2;

相关推荐
云飞云共享云桌面1 分钟前
医疗器械设备研发:多人同时操作 SolidWorks,怎样依靠单台服务器替代多工作站
运维·服务器·网络·数据库·制造
知行合一。。。5 小时前
RAG--03--Milvus基本用法
数据库·oracle·milvus
TDengine (老段)6 小时前
TDengine 线程模型 — 网络、调度、执行
大数据·数据库·物联网·制造·时序数据库·tdengine·涛思数据
上学的小垃圾7 小时前
01-数据库系统概述
数据库
二进制漫游记7 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding
2501_928996228 小时前
GPT-4o换DeepSeek迁移成本多少?中科热备解析API聚合平台技术账本
前端·数据库·人工智能
泡干脆面就番茄10 小时前
MySQL_子查询_分页查询与联合查询详解
数据库·mysql
devpotato11 小时前
缓存与数据库更新顺序不一致问题
java·数据库·redis
天若有情67311 小时前
Node+MySQL小型全栈笔记项目实战课程分享
数据库·笔记·mysql
wxwx_bscxy32211 小时前
基于springboot宠物领养系统的设计与实现
数据库·spring boot·后端·spring·宠物