【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_insert
    after insert on payments -- 还可写update / delete
    for each row -- 触发器会作用于每一个受影响的行
begin
    update invoices
        set payment_total = payment_total + new.amount
    where 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_delete
    after delete on payments
    for each row
begin
    update invoices
        set payment_total = payment_total - old.amount
    where 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_insert
    after insert on payments
    for each row -- 触发器会作用于每一个受影响的行
begin
    update invoices
    set payment_total = payment_total + new.amount
    where invoice_id = new.invoice_id;
    
	-- 往记录操作的表里插入一条数据,类型为插入
    insert into payments_audit
        values (new.client_id, new.date, new.amount, 'Insert', now());
end $$
delimiter ;

drop trigger if exists payments_after_delete;
delimiter $$
create trigger payments_after_delete
    after delete on payments
    for each row
begin
    update invoices
    set payment_total = payment_total - old.amount
    where invoice_id = old.invoice_id;
	-- 往记录操作的表里插入一条数据,类型为删除
    insert into payments_audit
    values (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 schedule
    every 10 second starts '2019-01-01' ends '2029-01-01'
do begin
    delete from payments_audit
        where 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;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux服务器Java环境搭建】09 在CentOS系统中安装和配置clickhouse数据库

一、安装环境 CentOS7 二、官网安装参考文档 官网安装参考文档 不同系统请参考如下建议 从RPM软件包安装&#xff1a; 建议在CentOS、RedHat和所有其他基于rpm的Linux发行版上使用官方预编译的rpm软件包从DEB软件包安装&#xff1a; 建议在Debian或Ubuntu上使用官方预编译…

分割均衡字符串 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 均衡串定义:字符串只包含两种字符&#xff0c;且两种字符的个数相同。 给定一个均衡字符串&#xff0c;请给出可分割成新的均衡子串的最大个数。 约定字符串中只…

【数据结构(十二·图)】图的相关知识(包括深度优先遍历和广度优先遍历)

文章目录 1. 图的基本介绍1.1. 图的举例说明1.2. 图的常用概念 2. 图的表示方式2.1. 邻接矩阵2.2. 邻接表 3. 应用案例4. 图的遍历4.1. 深度优先遍历4.1.1. 基本思想4.1.2. 算法步骤4.1.3. 代码实现 4.2. 广度优先遍历4.2.1. 基本思想4.2.2. 算法步骤4.2.3. 代码实现 4.3. 图的…

【Geoserver】将geoserver迁移到jetty的发行包中

之前讲了在Geosever的二进制发行包中升级jetty的内容&#xff0c;我测试之后发现有些问题&#xff0c;本地运行可能没有问题&#xff0c;但是在linux上运行报错了。 于是我想着换个思路好了&#xff0c;总是想着将Geosever中的jetty包替换掉&#xff0c;干脆反过来&#xff0c;…

css 实现GTA5 封面

上面的图片如何通过css 完成呢。废话不说&#xff0c;直接上代码 <template><view class"movie_report"><view class"movie_img" v-for"item in 9" :key"item"><image :src"../../static/item.png" &…

螺旋矩阵算法(leetcode第54题)

题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a;输入&#xff…

用python打印出菱形图案

你可以使用Python编写一个简单的函数来打印菱形图案。下面是一个例子&#xff0c;这个函数接受一个参数n&#xff0c;表示菱形的高度&#xff0c;然后打印出一个菱形图案&#xff1a; def print_diamond(n): # 上半部分 for i in range(n): print(" " …

接口测试练习步骤

在接触接口测试过程中补了很多课&#xff0c; 终于有点领悟接口测试的根本&#xff1b; 偶是个实用派&#xff5e;&#xff0c;那么现实中没有用的东西&#xff0c;基本上我都不会有很大的概念&#xff1b; 下面给的是接口测试的统一大步骤&#xff0c;其实就是让我们对接口…

滑动窗口如人生,回顾往事不复还———力扣刷题

第一题&#xff1a;长度最小的子数组 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 思路&#xff1a; 第一想法肯定时暴力枚举&#xff0c;枚举数组任何一个元素&#xff0c;把他当起始位置&#xff0c;然后从起始位置找最短区间&#xff0c;使得…

接口测试 — 2.Requests库介绍

1、接口测试的意义&#xff08;优势&#xff09; &#xff08;1&#xff09;更早的发现问题&#xff1a; 不少的测试资料中强调&#xff0c;测试应该更早的介入到项目开发中&#xff0c;因为越早的发现bug&#xff0c;修复的成本越低。 然而功能测试必须要等到系统提供可测试…

微搭低代码实现登录注册功能

目录 1 创建用户数据源2 实现登录逻辑3 搭建登录页面4 设置登录框5 实现登录的逻辑6 用户注册总结 原来产品在创建应用的时候可以创建模型应用&#xff0c;模型应用对应我们小程序的后端。最新的更新已经将模型应用的能力下线&#xff0c;那我们不得不自己实现一下后端的逻辑。…

目前进度记录

目前已经把之前记录的方法都实现了&#xff0c;目前的主函数可以写的更简单比如 int main(int argc, char* argv[]) {KernelClass::create_kernel();MPI_Init(&argc, &argv);kernel().mpi_manager.init_mpi(argc, argv);//创建种群int group1 kernel().conn_manger.c…

链表基础知识(一、单链表)

一、链表表示和实现 顺序表的问题及思考 问题&#xff1a; 1. 中间/头部的插入删除&#xff0c;时间复杂度为O(N) 2. 增容需要申请新空间&#xff0c;拷贝数据&#xff0c;释放旧空间。会有不小的消耗。 3. 增容一般是呈2倍的增长&#xff0c;势必会有一定的空间浪费。例如当…

【CANoe】CANoe手动发送XCP报文读取观测量

文章目录 1、硬件连接&#xff1a;配置CANoe的CAN端口&#xff0c;连接到ECU标定对应的CAN口2、配置CAN IG模块报文&#xff1a;连接XCP&#xff0c;读取观测量&#xff0c;断开XCP3、报文解析4、参考资料 1、硬件连接&#xff1a;配置CANoe的CAN端口&#xff0c;连接到ECU标定…

【JUC】二十七、synchronized锁升级之无锁

文章目录 1、背景2、Monitor、Java对象、线程如何关联起来的&#xff1f;3、synchronized锁升级4、锁升级之无锁 关于synchronized同步&#xff0c;能用无锁结构就不要用锁&#xff1b;能锁块&#xff0c;就不要锁整个方法&#xff1b;能用对象锁&#xff0c;就不要用类锁。 用…

探秘机器学习核心逻辑:梯度下降的迭代过程 (图文详解)

一 需求解函数 f() 和 g()函数分别为求y值和求导数的函数。 目的&#xff1a;求该函数的最小值&#xff1a; 代码&#xff1a; import numpy as np import matplotlib.pyplot as plt f lambda x : (x - 3.5) ** 2 - 4.5 * x 10 g lambda x : 2 * (x - 3.5) - 4.5x np.l…

1.3 什么是接口?什么是接口测试?

上一小节我们认识了C/S和B/S架构,那在B/S架构中,我们测试最常接触的,就是接口。本课程的重点是接口自动化测试,那同学们真的了解什么是接口吗?首先,我们从通俗的角度来看什么是接口。在计算机中,接口是计算机系统中两个独立的部件进行信息交换的共享边界。这种交换可以发…

ARM day8

1.题目&#xff1a;主机获取从机里面的温湿度数据&#xff0c;并打印出来 结果&#xff1a; 代码&#xff1a; main.c #include "iic.h"#include "si7006.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){short tem;…

ThingsBoard 前端项目轮播图部件开发

前言 ThingsBoard 是目前 Github 上最流行的开源物联网平台&#xff08;14.6k Star&#xff09;&#xff0c;可以实现物联网项目的快速开发、管理和扩展, 是中小微企业物联网平台的不二之选。 本文介绍如何在 ThingsBoard 前端项目中开发轮播图部件。 产品需求 最近接到产品…

自动化测试、压力测试、持续集成

因为项目的原因&#xff0c;前段时间研究并使用了 SoapUI 测试工具进行自测开发的 api。下面将研究的成果展示给大家&#xff0c;希望对需要的人有所帮助。 SoapUI 是什么&#xff1f; SoapUI 是一个开源测试工具&#xff0c;通过 soap/http 来检查、调用、实现 Web Service …