当前位置: 首页 > news >正文

mysql的触发器

触发器介绍
  • 触发器是一种特殊的存储过程,和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL代码,只是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL代码的执行,无需手动调用
  • 在mysql中,只有执行insert、delete、update操作时才能触发触发器
  • 触发器的这种特性可以协作应用在数据库端确保数据的完整性,日志记录、数据校验等操作
  • 使用别名old和new来引用触发器中发送变化的记录内容,这与其他数据库类似,现在触发器还只能支持行级触发,不支持语句触发
2、触发器的特点
  • 触发的条件:insert、delete、update
  • 触发时机:在增删改之前或之后
  • 触发频率:针对每一行
  • 触发器定义在表中or附着在表上,一般是附着在表上,即定义完表之后再定义触发器
3、创建触发器

3.1 创建只有一个执行语句的触发器

create trigger trigge_name before|after 触发事件
on table_name for each row
执行语句;

3.2 创建有多个执行语句的触发器

create trigger trigger_name before|after 触发事件
on table_name for each row
begin执行语句列表
end;

3.3 示例:

  • 当用户表中有增删改的操作时,日志表能自动记录

    – 数据准备

    create database demo_trigger;
    use demo_trigger;create table user(user_id int primary key,user_name varchar(16) not null,password varchar(16) not null
    )charset = utf8;create table user_logs(id int primary key auto_increment,time timestamp,lob_text varchar(255)
    )charset = utf8;
    

    – 当用户表增加用户时,日志表自动记录

    drop trigger if exists trigger01;create trigger trigger01 after insert
    on user for each row
    insert into user_logs values(null, now(), 'user表中添加了新用户');--往user表中添加数据触发触发器
    insert into user values(1, 'jack', '123456');
    

    –当用户表中数据被修改时,日志表自动记录

    drop trigger if exists trigger02;create trigger trigger02 before update
    on user for each row
    insert into user_logs values(null, now(), 'user表中有数据被修改');update user set password = '654321' where user_id = 1;
    
5、触发器的new和old关键字

5.1 mysql中定义了new和old用来表示触发器所在的表中,触发了触发器的那一行数据,触发器不断能记录有变化,还能记录具体的变化

触发器类型new和old的使用
insert型触发器new表示将要(before)或者已经(after)新增的数据
update型触发器old表示修改之前的数据,new表示将要或已经修改的数据
delete型触发器old表示将要或已经删除的数据

5.2 insert类型触发器

drop trigger if exists trigger03;create trigger trigger03 after insert
on user for each row
insert into user_logs values(null, now(), concat_ws(',', '添加了新用户,信息为:', new.user_id, 										new.user_name, new.password));insert into user values(2, 'mike', '123456');

5.3 update类型触发器

drop trigger if exists trigger04;create trigger trigger04 after update
on user for each row
insert into user_logs values(null, now(), concat_ws(',', '用户信息被修改', '修改前的user_id:', old.user_id, '修改前的user_name;', old.user_name, '修改前的password:', old.password, '修改后的user_id:', new.user_id, '修改后的user_name;', new.user_name, '修改后的password:', new.password));update user set password = '111111' where user_name = 'mike';

5.4 delete类型触发器

drop trigger if exists trigger05;create trigger trigger05 after delete
on user for each row
insert into user_logs values(null, now(), concat('用户', old.suer_name, '的信息被删除'));delete from user where user_name = 'jack';
6、查看和删除触发器
--查看触发器
show triggers;--删除触发器
drop trigger if exists trigger_name;
7、触发器注意事项
  • 触发器不能对本表进行insert、update、delete操作,以免递归循环触发
  • 触发器针对每一行的执行,应尽量减少触发器,避免降低效率,对增删改频繁的表切记不要使用触发器,它会非常消耗资源

http://www.mrgr.cn/news/67008.html

相关文章:

  • 达梦数据守护集群_动态增加实时备库
  • 【大模型LLM面试合集】大语言模型架构_chatglm系列模型
  • HTB:Grandpa[WriteUP]
  • andrular输入框input监听值传递
  • 单片机串口接收状态机STM32
  • 应用层代理技术
  • 文件操作:Xml转Excel
  • es自动补全(仅供自己参考)
  • ASRPRO 日历2
  • Python 装饰器 (面向切面编程,语法糖,AOP)
  • PySpark 本地开发环境搭建与实践
  • 对自动化测试的一些展望与理解
  • Linux(CentOS)安装 MySQL
  • 伊莱亚斯 M. 斯坦恩(Elias M. Stein)《复分析》与《实分析》教材
  • APP 后台广告位配置的关键要素与策略
  • 浏览器是如何渲染页面的? - 2024最新版前端秋招面试短期突击面试题
  • 编程语言越来越多,为什么C/C++还没有被现在的时代淘汰呢?
  • 智合同丨买卖合同纠纷中,起诉关联公司需要准备些什么?
  • JVM 内存结构中哪些区域可能发生 OOM
  • 红队-linux基础(1)
  • linux利用环境变量提权以及如何防范
  • 基本开关电源电路分析
  • Axure设计之三级联动选择器教程(中继器)
  • 大家知道输电线路微风振动在线监测有哪些先进技术?
  • docker 入门教程
  • 什么是广告联盟?