【Trigger】MySQL之触发器

AstrBot插件开发全攻略:从零编写一个天气查询插件(Python实战) 本文提供了一份详细的AstrBot插件开发实战指南,手把手教你使用Python从零编写一个智能天气查询插件。内容涵盖插件系统核心设计、开发环境搭建、API调用与数据处理、自然语言交互实现以及插件打包发布全流程,帮助你快速掌握基于AstrBot框架的聊天机器人功能扩展技能。 阅读详情
MySQL之触发器

1、MySQL触发器

1.1、什么是触发器

  • MySQL触发器(Trigger)是一种特殊的存储过程,

  • 它与表有关,当表上的特定事件(insert,update,delete)发生时,触发器会自动执行。

  • 可以使用触发器来实现数据约束,数据验证,数据复制等功能

1.2、为什么使用触发器

  • 可以实现数据约束,数据验证,数据复制等功能

    • 例如:

      • 可以创建一个触发器,在向表中插入一条记录时,自动向另一个表中插入一个记录,从而实现数据复制的功能。
  • 触发器还可以用于实现数据验证,

    • 例如

      • 在插入或更新数据时,检查记录的某些字段是否符合要求,则拒绝插入或者更新,这样可以保证数据的完整性和一致性。

1.3、创建触发器

语法:

create trigger 触发器名称
{before | after } {insert | update | delete}  -- 触发器类型和事件
on 表名称
for each row  -- 触发器的作用范围
begin
    -- 触发器执行的操作
end;
  • 触发器名称可以自定义 ,并唯一性,见名知意
  • before / after : 表示触发器的类型,分别表示发生前/发生后执行
  • insert / update / delete : 表示触发器的事件类型,分别表示插入 / 更新 / 删除操作
  • on 表名称 : 为触发器所在的表名
  • for each row : 表示触发器作用的范围,即每一行记录都会触发该触发器
  • begin 和 end之间是触发器执行的操作,可以是一条或者多条SQL语句
  • 触发器是自动执行的,无需手动调用,

  • 当表上的特定事件(insert , update, delete ) 发生时,触发器会自动执行

  • 在创建触发器时,可以定义触发器的类型和事件,从而控制触发器的时机和条件

案例:

-- 创建两张表
create table table1(
    id int,
    name varchar(20) character set utf8
)charset = utf8;

create table table2(
    id int,
    name varchar(20) character set utf8
)charset = utf8;
1.3.1、添加事件
-- 创建一个触发器,当向表中插入一条记录时,自动向另一个表中插入一条记录
create trigger insert_trigger_1
after insert on table1
    for each row
    begin
        -- 触发器的具体事件
        insert into table2(id,name) values (NEW.id,New.name);
    end;

添加数据:

向table1表中添加数据时,会触发insert_trigger_1触发器,自动向table2表中添加数据

insert into table1(id,name) values (1,'kobe'),(2,'lebron'),(3,'curry'),(4,'durant'),(5,'paul'),(6,'westbrook');

查询table1表

select * from table1;

在这里插入图片描述

查询table2表

select * from table2;

在这里插入图片描述

1.3.2、删除事件
-- 创建一个触发器,当从表中删除一条记录时,自动从另一个表中删除一条记录
create trigger delete_trigger_1
 after delete on table1
    for each row
    begin
        delete from table2 where id = OLD.id and name = OLD.name;
    end;

删除数据:

删除table1表中数据时,会触发delete_trigger_1触发器,自动删除table2表中对应的数据

delete from table1 where id = 5 and name = 'paul';

查看两张表中的数据

select * from table1;

在这里插入图片描述

select * from table2;

在这里插入图片描述

1.3.3、修改事件
-- 创建一个触发器,当向表中更新一条记录时,自动更新另一个表中的记录
create trigger update_trigger_1
after update on table1
    for each row
    begin
        update table2 set id = NEW.id, name = NEW.name  where id = OLD.id and name = OLD.name;
    end;

修改数据:

修改table1表中数据时,会触发update_trigger_1触发器,自动更新table2表中对应的数据

update table1 set id = 10,name = 'paul' where id = 6 and name = 'westbrook';


select * from table1;

在这里插入图片描述

select * from table2;

1.4、删除触发器

drop trigger 触发器名称;

1.5、触发器的应用场景

触发器的应用场景包括但不限于以下几种:

  1. 强制实施业务规则:通过在触发器中编写逻辑,可以在特定的表上自动执行业务规则,例如检查输入的数据是否符合要求,或者限制某些操作的执行。

  2. 记录日志变更:通过在触发器中编写逻辑,可以在特定的表上自动记录数据的变更情况,例如记录数据的修改时间、修改人等信息。

  3. 复杂的默认值计算:通过在触发器中编写逻辑,可以在特定的表上自动计算默认值,例如根据其他字段的值计算出一个新的字段的值。

  4. 数据同步:通过在触发器中编写逻辑,可以在多个表之间自动同步数据,例如在一个表中插入一条数据时,自动在另一个表中插入相应的数据。

  5. 数据校验:通过在触发器中编写逻辑,可以在特定的表上自动校验数据的正确性,例如检查数据的唯一性、完整性等。

1.6、???生成列

在MySQL 5.7之前,想要实现当表上的特定事件(insert,update,delete)发生时,自动操作对应的逻辑,只能通过触发器来实现,在MySQL 5.7之后可以用生成列来实现,生成列(也称为计算列或虚拟列)。

假设,现在有如下需求,现在有一列date_time数据,在我插入,更新这一列数据的时候,会自动截取,date部分的数据,放入到date列。例如,date_time列插入数据2024-07-18T13:40:30,date列会自动生成2024-07-18

1.6.1、Trigger做法:

首先创建表

create table date_trigger(
    id int,
    date_time DATETIME,
    date DATE
)charset = utf8;

插入Trigger脚本

-- 创建 BEFORE INSERT 触发器
DELIMITER //

CREATE TRIGGER before_insert_date_trigger
BEFORE INSERT ON date_trigger
FOR EACH ROW
BEGIN
    SET NEW.date = CAST(NEW.date_time AS DATE);
END; //

DELIMITER ;

-- 创建 BEFORE UPDATE 触发器
DELIMITER //

CREATE TRIGGER before_update_date_trigger
BEFORE UPDATE ON date_trigger
FOR EACH ROW
BEGIN
    SET NEW.date = CAST(NEW.date_time AS DATE);
END; //

DELIMITER ;

插入数据:

insert into date_trigger(id,date_time) values (1,NOW());

查询数据

select * from date_trigger;

在这里插入图片描述

1.6.2、生成列做法:

执行下面sql,新建一个date_gen表,同时绑定生成列逻辑

create table date_gen(
    id int,
    date_time DATETIME,
    `date` date GENERATED ALWAYS AS (cast(`date_time` as date)) STORED
)charset = utf8;

我们可以看到他是date字段是根据date_time生成的,将date_time转换成date格式,并持久化(STORED)

我们插入数据看看

insert into date_gen(id,date_time) values (1,NOW());

查询结果

SELECT * from date_gen;

在这里插入图片描述

总结:

查询效率影响

  1. 额外的列更新成本:每次插入或更新操作时,触发器会额外执行一次赋值操作,这可能会略微增加操作的执行时间。

  2. 索引和查询优化:如果 date列是经常用于查询的列,并且有索引支持,那么触发器可能导致索引的更新频率增加,进而影响查询性能。数据库引擎在处理更新时可能需要重新计算索引,特别是在高并发情况下会有一定的成本。

插入效率影响

  1. 触发器执行开销:每次插入操作都会触发触发器执行额外的逻辑,包括赋值操作和任何其他逻辑。这些操作可能会轻微延长插入操作的总时间。

  2. 行级锁和并发性:在高并发环境下,触发器可能导致对受影响行的行级锁定时间延长,因为数据库引擎需要确保触发器的逻辑完整执行。

控制和优化

虽然触发器可能会带来一些性能开销,但可以通过以下方式来控制和优化:

  • 适当的索引设计:确保 date列及其经常查询的列有合适的索引,可以帮助数据库引擎优化查询效率。

  • 触发器的简化和优化:尽量保持触发器的逻辑简单和高效,避免复杂的操作和频繁的触发条件。

  • 硬件和配置优化:通过增加硬件资源(如更多的内存、更快的存储设备)和合理的 MySQL 配置来提升整体性能。

在实际应用中,触发器通常不会显著降低 MySQL 的查询和插入效率,特别是在合理使用和优化的情况下。它们提供了在旧版本 MySQL 中实现功能的一种有效方法,尤其是在没有生成列功能的情况下。然而,如同任何数据库设计和优化工作一样,评估和测试是确保系统性能满足需求的关键步骤。

如果这篇文章对您有帮助,希望您能关注、点赞、评论!!!

在这里插入图片描述

光学仿真案例(4) 基于纳米微粒激发平面波的米氏散射FDTD仿真模拟 本案例展示了一个基于纳米粒子激发平面波的米氏散射仿真模型(mie scattering),计算其散射和吸收截面、局域场增强和远场散射分布,同时将截面和远场结果与解析解进行了比较,验证了仿真模拟的准确性。 阅读详情

相关推荐

红日-VulnStack靶场-ATT&CK(二):从Weblogic漏洞到域控渗透实战

本文详细解析了红日安全团队VulnStack靶场中从Weblogic漏洞到域控渗透的完整攻击链。通过实战演示Weblogic反序列化漏洞利用、Cobalt Strike持久化控制、域内信息收集及PsExec横向移动等关键技术,复现了企业内网渗透的典型场景,并提供了防御建议。

tgb3456789的博客 936

MySQL之触发器

触发器的应用场景非常广泛,可以用于强制实施业务规则、记录日志变更、复杂的默认值计算、数据同步以及数据校验等。在创建触发器时,需要指定触发器的名称、触发器所在的表、触发器的触发时机(如insert、update或delete操作)、触发器的执行次数(for each row或for each row statement)以及触发器的逻辑。

陆卿之的博客 3万+

Cherry Studio 新手必看:5分钟搞定MCP服务器配置(附常见问题解决)

本文为Cherry Studio新手提供了详细的MCP服务器配置指南。文章从核心概念入手,解释了Cherry Studio作为MCP客户端如何通过MCP协议安全、标准化地扩展AI助手能力。重点讲解了uv和Bun环境的安装与常见网络问题的解决方案,并演示了如何添加首个MCP服务器(如mcp-server-fetch),助你快速构建可扩展的智能工作流。

corn8的博客 595

MySQL-触发器(TRIGGER)

MySQL 的触发器和存储过程一样,都是嵌入到 MySQL 中的一段程序,是 MySQL 中管理数据的有力工具。通过对数据表的相关操作来触发、激活从而实现执行。

m0_53222084的博客 1万+

手把手教你用FPGA解析AD9680的JESD204B数据流(附Verilog代码)

本文详细介绍了如何利用FPGA解析AD9680的JESD204B数据流,包括协议核心机制、硬件平台搭建、Verilog代码实现及调试技巧。通过实战案例和代码示例,帮助工程师快速掌握高速ADC数据采集与处理技术,提升系统性能。

weixin_33640562的博客 372

NU1680无线充电接收器在TWS耳机中的应用实战:I2C调压与QI协议适配

本文详细解析了NU1680无线充电接收器在TWS耳机充电仓设计中的应用实战。重点阐述了其无固件设计、I2C接口动态调压功能如何解决不同QI协议发射器的兼容性难题,并分享了硬件设计、PCB布局、与发射端联调及安全测试等关键环节的实践经验,助力开发者快速实现稳定高效的无线充电方案。

weixin_28432777的博客 232

MySQL-触发器

MySQL-触发器

真正的大师永远怀着一颗学徒的心 2万+

信贷风控实战指南:Vintage分析表从数据建模到风险洞察

本文是一份信贷风控实战指南,详细阐述了Vintage分析从数据建模到风险洞察的全流程。文章深入解析了Vintage分析作为信贷资产“体检报告”的核心价值,并提供了从借据表与还款计划表设计、账龄计算、逾期口径判定到风险暴露计算与最终可视化透视的完整SQL实现方案,旨在帮助风控从业者构建精准的风险监控体系。

nft7creator的博客 321

MySQL | MySQL触发器

本篇文章详细介绍了在mysql中如何创建触发器、查看触发器以及如何删除触发器。

天下弈星~的博客 4520

【WRF数据准备】海温(SST)数据替换

【WRF数据准备】海温(SST)数据替换

WW、forever的博客 1118

maya导入导出bvh 自动 脚本

maya打开bvh脚本

jacke121的专栏 1550

mysql 触发器trigeer_MySQL创建触发器(CREATE TRIGGER)

触发器是与 MySQL 数据表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。基本语法在 MySQL 5.7 中,可以使用 CREATE TRIGGER 语句创建触发器。语法格式如下:CREATE < BEFORE | AFTER >ON FOR EACH Row语法说明如下。1) 触发器名触发器的名称,...

weixin_39678451的博客 1155

Untiy之如何实现AI+MR (Pico4u 相机推流MR画面给Server做实时AI图像识别)

本文介绍了基于Pico4U企业版开发AI+MR应用的实现方案。文章详细说明了硬件准备步骤,包括购买企业版设备、申请相机权限和注册管理平台。重点讲解了Unity开发中获取摄像头画面的两种技术方案:通过Overlay直接渲染到Android Surface,或使用API获取图像数据转换为Texture。提供了完整的代码示例和权限配置说明,并揭示了底层通过JNI调用Android原生API的技术原理。该方案适用于带电操作等实习场景,可提升安全性和学习趣味性。

TxNet 1339

[MySQL]触发器(Trigger)使用遇上的一个小坑

前些天同事问了我MySQL有没有触发器机制,在数据更改的时候可以直接将更改的那条数据插入到另一个表中。 其实我也不是学数据库的,只是大致的用过一些日子,就上网搜索,看到了TRIGGER,然后推荐给了同事。 今天中午同事联系我,说这个问题解决了吗?TRIGGER他那儿使不上。 我当时草草的读了一下TRIGGER的简介感觉能够使用,于是就先说暂时没有研究,最近在做集团的科研项目,目标也是比较模糊,就顺道学一下TRIGGER吧。 TRIGGER意味触发器,那么触发器自然是有触发条件的,触发条件按照网上的教

Choubelle的博客 810

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

mysql的trigger创建when_创建mysql触发器

Summary: in this tutorial, you will learn how to createtrigger in MySQLby using theCREATE TRIGGERstatement.You should follow theintroduction to SQL triggersand trigger implementation in MySQLfirst bef...

weixin_30967451的博客 492

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

MySQL—触发器(Trigger)(十三)

MySQL—触发器(Trigger)(十三)

qq_21370419的博客 625

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

MySQL触发器Trigger加载以及目前局限

首先需要知道MySQL中触发器特点,以及表table相关触发器加载方式MySQL中单个trigger仅支持单事件触发即单个触发器不支持类似insert or update等多事件语法操作,如果需要多事件都能被同一个表触发,只能分别建立多个对应trigger。触发器加载首先需要加载触发器分组列表Trigger_chain,后续再将具体触发器添加到Trigger_chain内。

GreatSQL2021的博客 412

mysql 触发器 drop_MySQL修改和删除触发器(DROP TRIGGER)

修改触发器可以通过删除原触发器,再以相同的名称创建新的触发器。基本语法与其他MySQL数据库对象一样,可以使用 DROP 语句将触发器从数据库中删除。语法格式如下:DROP TRIGGER [ IF EXISTS ] [数据库名] 语法说明如下:1) 触发器名要删除的触发器名称。2) 数据库名可选项。指定触发器所在的数据库的名称。若没有指定,则为当前默认的数据库。3) 权限执行 DROP TRIG...

weixin_29164843的博客 433

MySQL修改和删除触发器(DROP TRIGGER)

修改触发器可以通过删除原触发器,再以相同的名称创建新的触发器。 基本语法 与其他 MySQL 数据库对象一样,可以使用 DROP 语句将触发器从数据库中删除。 语法格式如下: DROP TRIGGER [ IF EXISTS ] [数据库名] <触发器名> 语法说明如下: 1) 触发器名 要删除的触发器名称。 2) 数据库名 可选项。指定触发器所在的数据库的名称...

MySQL下载步骤详解(带安装教程) 1671
上一篇: 【SpringBoot】配置文件
下一篇: 【报错解决】MySQL报错:sql_mode=only_full_group_by
普通网友
博客等级 码龄1年 6粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值