【MySQL】触发器trigger / 事件

文章目录

  • 1. 触发器 trigger
    • 1.1 触发器命名
    • 1.2 new和old关键字
    • 1.3 案例:insert 触发器
    • 1.4 练习:delete 触发器
    • 1.5 查看触发器 show triggers
    • 1.6 使用触发器记录对表的操作
  • 2 事件
    • 2.1 打开 / 关闭事件调度器
    • 2.2 创建事件 create event
    • 2.3 查看,删除和更改事件

1. 触发器 trigger

  • 触发器是在插入、更新和删除语句前后执行的一堆SQL代码。
  • 使用触发器的目的:增强数据一致性;更改表1后,与表1有关联的表的相关数据也会同步更新。

1.1 触发器命名

  • 表名_after/before_操作(update/delete/insert)
  • 这样可以在查看触发器时进行筛选,可以筛选出与哪个表有关的触发器。

1.2 new和old关键字

  • new关键字:返回刚刚插入的行
  • old关键字:返回更新或删除的行

1.3 案例:insert 触发器

  • 在payments表增加新数据后,触发invoices表中相关的数据同步更新
drop trigger if exists payment_after_insert;
delimiter $$
create trigger payment_after_insertafter insert on payments -- 还可写update / deletefor each row -- 触发器会作用于每一个受影响的行
beginupdate invoicesset payment_total = payment_total + new.amountwhere invoice_id = new.invoice_id;
end $$
delimiter ;insert into payments
values (default, 5, 3, '2019-01-01', 10, 1)

结果:原来id为3的total是0,触发器后自动更新为10
在这里插入图片描述

1.4 练习:delete 触发器

  • 删除在payments表中增加的数据,invoices表中的total又变回了原来的0;
drop trigger if exists payment_after_delete;
delimiter $$
create trigger payments_after_deleteafter delete on paymentsfor each row
beginupdate invoicesset payment_total = payment_total - old.amountwhere invoice_id = old.invoice_id;
end $$
delimiter ;delete from payments
where payment_id = 9;

结果:
在这里插入图片描述

1.5 查看触发器 show triggers

-- 查看所有触发器
show triggers
-- 按条件筛选查看触发器
show triggers like 'payments%'

在这里插入图片描述

1.6 使用触发器记录对表的操作

  • 触发器的另一常见用途:记录对表的修改和操作。当增加或删除了某条数据时,可以把操作记录下来。
  • 案例:创建了一个简易的记录表进行演示
    • 创建了一个简易的记录操作的表payments_audit来记录。会记录被操作了的数据的一些信息,以及操作本身的类型、操作时间。
-- 在插入数据后,进行操作的记录
drop trigger if exists payment_after_insert;
delimiter $$
create trigger payment_after_insertafter insert on paymentsfor each row -- 触发器会作用于每一个受影响的行
beginupdate invoicesset payment_total = payment_total + new.amountwhere invoice_id = new.invoice_id;-- 往记录操作的表里插入一条数据,类型为插入insert into payments_auditvalues (new.client_id, new.date, new.amount, 'Insert', now());
end $$
delimiter ;drop trigger if exists payments_after_delete;
delimiter $$
create trigger payments_after_deleteafter delete on paymentsfor each row
beginupdate invoicesset payment_total = payment_total - old.amountwhere invoice_id = old.invoice_id;-- 往记录操作的表里插入一条数据,类型为删除insert into payments_auditvalues (old.client_id, old.date, old.amount, 'Delete', now());
end $$
delimiter ;insert into payments
values (default, 5, 3, '2019-01-01', 10, 1);delete from payments
where payment_id = 10;

运行结果:payments_audit表中记录了两条操作记录
在这里插入图片描述

2 事件

  • 事件是根据计划执行的任务。
    • 事件可以执行一次,也可以按照某种规律执行。如每天早上十点或每月一次。
    • 可以通过事件来自动化数据库维护任务,如删除已经过期的数据,把数据从一张表复制到存档表,或汇总数据生成报告。

2.1 打开 / 关闭事件调度器

  • show variables like ‘event%’:找到事件管理器变量。
    • show variables:查询所有的系统变量
  • set global event_scheduler = on : 打开事件调度器
  • set global event_scheduler = off:关闭事件调度器

2.2 创建事件 create event

  • on schedule 后接时间
    • at ‘2019-05-01’,执行一次
    • every ,定期执行
  • 每隔10秒执行一次,删除执行之间超过5分钟的数据。
drop event if exists yearly_delete_stale_audit_rows;
delimiter $$
create event yearly_delete_stale_audit_rows
on scheduleevery 10 second starts '2019-01-01' ends '2029-01-01'
do begindelete from payments_auditwhere action_date < now() - interval 5 minute;
end $$
delimiter ;

结果:创建事件前,audit表的数据:
在这里插入图片描述
创建时间后,删除了表中的数据
在这里插入图片描述

2.3 查看,删除和更改事件

  • show events like ‘yearly%’: 查看事件
    在这里插入图片描述
  • drop event if exists yearly_delete_stale_audit_rows: 删除事件
  • alter event:修改事件,和create event同样用法。可以用alter event替换create event
    • 启用或禁用事件:
    • alter event yearly_delete_stale_audit_rows disable;
    • alter event yearly_delete_stale_audit_rows enable;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/228775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师——数据结构(二)

&#x1f4d1;前言 本文主要是【数据结构】——软件设计师——数据结构的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

5个免费、跨平台的SQLite数据库可视化工具

前言 SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;目前最新的版本是 SQLite3。今天推荐5个实用的SQLite数据库可视化工具(GUI)&#xff0c;帮助大家更好的管理SQLite数据库。 什么是SQLite&#xff1f; SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;它以一个…

dp中最短编辑距离的笔记(分析dp)

dp分析往往就是看最后一步的变化。 分析&#xff1a; 设a串长度为i&#xff0c;b串长度为j。题目要求为通过三种操作将a字符串转化为b字符串的最少次数。 删除操作&#xff1a; 把a[i]删除后a[1~i]和b[1~j]匹配&#xff0c;所以可以得到f[i - 1][j] 1&#xff0c;在此之前要先…

连锁管理系统是什么?有哪些功能?

连锁管理系统帮助门店实现POS收银管理、门店管理、采购订货管理、线上商城搭建、供应链管理一体化管理系统&#xff0c;快速提高门店管理效率&#xff0c;无论你的门店有多少&#xff0c;连锁总部都能通过系统随时洞察监管门店的所有运营数据。 连锁管理系统由&#xff1a;1个…

Eslint 要被 Oxlint替换了吗

什么是 Oxlint 由于最近的rust在前端领域的崛起,基于rust的前端生态链遭到rust底层重构,最近又爆出OxLint,是一款基于Rust的linter工具。Oxlint在国外前端圈引起热烈讨论,很多大佬给出了高度评价。 事实上,Oxlint 是 Oxc 项目旗下的一款产品,专为 JavaScript 和 TypeSc…

Java解决不同路径问题

Java解决不同路径问题 01 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少…

linux修改mysql默认端口(很明智的选择因为后面会遇到各种问题)

1. 登录到mysql查看当前的端口号&#xff1a; show global variables like ‘port’; 2.编辑/etc/my.conf 文件添加port3506 这样的样式 保存退出&#xff1b; 内容: mysqld] port3506 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock usermysql # Disabling sy…

【CMU 15-445】Lecture 10: Sorting Aggregations Algorithms 学习笔记

Sorting & Aggregations Algorithms SortingTop-N Heap SortExternal Merge Sort2-WAY External Merge SortK-WAY External Merge SortDouble Buffering Optimization AggregationsSortingHashing 本节课主要介绍的是数据库系统中的排序算法以及聚合算法 Sorting 排序算法…

【TB作品】51单片机 实物+仿真-电子拔河游戏_亚博 BST-M51

代码工程。 http://dt4.8tupian.net/2/28880a66b12880.pg3这段代码是用于一个数字拔河游戏的嵌入式系统&#xff0c;采用了基于8051架构的单片机&#xff0c;使用Keil C51编译器。 主要功能包括&#xff1a; 数码管显示&#xff1a;使用了四个数码管&#xff08;通过P2的控制…

【华为数据之道学习笔记】5-4 数据入湖方式

数据入湖遵循华为信息架构&#xff0c;以逻辑数据实体为粒度入湖&#xff0c;逻辑数据实体在首次入湖时应该考虑信息的完整性。原则上&#xff0c;一个逻辑数据实体的所有属性应该一次性进湖&#xff0c;避免一个逻辑实体多次入湖&#xff0c;增加入湖工作量。 数据入湖的方式…

配置 vim 默认显示行号 行数 :set number

vi ~/.vimrc 最后添加一行 :set number保存退出&#xff0c;再次 vim 打开文件&#xff0c;默认就会显示行号了

Feign-实现Feign最佳实践

目录 一、实现最佳实践的步骤&#xff08;方式二&#xff09; 1.1 首先创建一个module&#xff0c;命名为feign-api&#xff0c;然后引入feign的starter依赖 1.2.将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目 1.3.在order-se…

Kali Linux安装Xrdp远程桌面工具结合内网穿透实现远程访问Kali桌面

文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于&#xff0c;它允许用户从远程位置访问Kali系统&#xff0c;而无需直接物理访…

vulnhub7

靶机地址&#xff1a;https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova 这次的靶机风格比较偏向 OSCP 风格&#xff0c;区别于传统的 CTF 类型的靶机&#xff0c;只需要提权到 root 即可&#xff0c;而且这次打靶确实触碰到很多知识盲区了 提示&#xff1a;本地…

安卓开发学习---kotlin版---笔记(二)

UI学习 UI分类 安卓的UI分为两大类&#xff1a;一类叫做View视图&#xff0c;一类叫做ViewGroup容器 View视图&#xff1a;TextView,Button,ImageView都是常见的视图ViewGroup容器&#xff1a;内部尅承载、放置、添加View视图的容器 布局方式 安卓布局主要有&#xff1a;线…

【Qt图书管理系统】4.系统设计与详细设计

文章目录 核心流程图软件架构设计流程图软件开发类图及功能点 核心流程图 用户登录图书查询图书借阅图书归还账户管理 软件架构设计 流程图 软件开发类图及功能点 Dlg_Login 登录界面 Cell_Main 主窗体 Cell_MyBook 我的书籍 Cell_BookMgr 书籍管理 Cell_RecoredMgr 借阅记录…

FC-13A(用于汽车应用的kHz范围晶体单元,低轮廓贴片)

FC-13A晶体非常适合用在汽车导航系统设计中的应用&#xff0c;是一种具有优异的频率性能和AEC-Q200标准认证的汽车工业级高精度晶体,FC-13A是一款尺寸为3.2 1.5 0.9mm&#xff0c;频率范围32.768KHz耐高温晶振&#xff0c;频率温度系数仅为-0.04ppm/℃&#xff0c;并且其老化…

2023年四川网信人才技能大赛 决赛 实操赛Web ezbbs Writeup

题目是一个BSS论坛&#xff0c;如图 尝试注册发现注册未开放 题目给了jar包以及给了一个提示条件竞争绕过&#xff0c;分析源码&#xff1a; /register、/login接口都在com.my.bbs.controller.rest.BBSUserController 首先cacheUser是BBSUser类型的私有属性&#xff0c;并且reg…

【Java】智慧工地系统:让建筑行业管理更简单

概述 智慧工地管理平台面向房建、能源、交通各类工地的管理者&#xff0c;通过AI视频、物联感知技术对工地场景中的施工机械、建筑材料、施工规范、施工环境监管、完善施工现场项目管控。实现项目管控、特种设备管理、绿色施工、工地巡检等业务功能&#xff0c;沉淀工地监管数…

大一python题库刷题训练,大一python填空题题库

大家好&#xff0c;给大家分享一下大一python题库及答案和分析&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 这篇文章主要介绍了大一python上机题库及答案&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完…