MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)

本文涉及的产品
RDS AI 助手,专业版
RDS Agent(兼容OpenClaw),2核4GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: MySQL数据库——触发器-案例(Insert类型、Update类型和Delete类型)

通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表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;

插入数据触发器

代码

写触发器时,多注意插入的数据与日志表的结构相对应;NEW表示将要或者已经新增的数据。

create trigger tb_user_insert_trigger  -- 触发器命名
after insert on tb_user for each row   -- 插入型的触发器,数据取自after
begin
 
    insert into user_logs(
        id, operation, operate_time, operate_id, operate_params)
    VALUES
        (null, 'insert', now(), NEW.id,  -- NEW表示将要或者已经新增的数据,这里只需要取其id
            concat   -- 拼接字符串,从NEW中取各自需要的信息
            ('插入的数据内容为:id=',NEW.id,',name=',NEW.name,',phone=',NEW.phone,',email=',         NEW.email, ',profession=', NEW.profession));
 
end;

测试

检查日志表中的数据是否可以正常插入,以及插入数据的正确性。

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

修改数据触发器

代码

在修改数据触发器中,OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据。

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,
        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;

删除数据触发器

代码

删除数据触发器中,OLD 表示将要或者已经删除的数据。

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,
        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;

END



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
9月前
|
SQL 关系型数据库 MySQL
Mysql数据恢复—Mysql数据库delete删除后数据恢复案例
本地服务器,操作系统为windows server。服务器上部署mysql单实例,innodb引擎,独立表空间。未进行数据库备份,未开启binlog。 人为误操作使用Delete命令删除数据时未添加where子句,导致全表数据被删除。删除后未对该表进行任何操作。需要恢复误删除的数据。 在本案例中的mysql数据库未进行备份,也未开启binlog日志,无法直接还原数据库。
|
SQL 关系型数据库 MySQL
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
存储 自然语言处理 关系型数据库
MySQL全文索引源码剖析之Insert语句执行过程
【8月更文挑战第17天】在MySQL中,处理含全文索引的`INSERT`语句涉及多步骤。首先进行语法解析确认语句结构无误;接着语义分析检查数据是否符合表结构及约束。随后存储引擎执行插入操作,若涉及全文索引则进行分词处理,并更新倒排索引结构。此外,事务管理确保了操作的完整性和一致性。通过示例创建含全文索引的表并插入数据,可见MySQL如何高效地处理此类操作,有助于优化数据库性能和提升全文搜索效果。
288 2
|
关系型数据库 MySQL
解决MySQL insert出现Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘xxx‘ at row 1
解决MySQL insert出现Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘xxx‘ at row 1
1552 2
|
存储 SQL 关系型数据库
MySQL中的update操作与锁机制
本文探讨MySQL中`UPDATE`操作的自动加锁机制及其对数据一致性的保障作用。尤其在InnoDB存储引擎下,系统会在涉及索引的更新操作中加行锁或间隙锁,防止多事务并发修改同一条记录。通过福利码兑换系统的实例展示,当线程A开启事务更新库存时,线程B试图更新相同记录会被阻塞,直至线程A提交。此外,文章还介绍了乐观锁及版本号控制等策略进一步提升并发性能的方法。作者:小明爱吃火锅,来源:稀土掘金。
901 2
|
SQL 关系型数据库 MySQL
MySQL异常一之: You can‘t specify target table for update in FROM clause解决办法
这篇文章介绍了如何解决MySQL中“不能在FROM子句中指定更新的目标表”(You can't specify target table for update in FROM clause)的错误,提供了错误描述、需求说明、错误做法和正确的SQL写法。
3096 0
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
364 0
|
SQL 数据采集 关系型数据库

热门文章

最新文章

推荐镜像

更多