[数据库] Navicat for MySQL触发器更新和插入操作

2023-11-09

 

一、触发器概念

       触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行。
        触发器经常用于加强数据的完整性约束和业务规则等。 触发器创建语法四要素:
       
1.监视地点(table)
        2.监视事件(insert/update/delete)
        3.触发时间(after/before)
        4.触发事件(insert/update/delete)

        触发器基本语法如下所示:

        其中:trigger_time是触发器的触发事件,可以为before(在检查约束前触发)或after(在检查约束后触发);trigger_event是触发器的触发事件,包括insert、update和delete,需注意对同一个表相同触发时间的相同触发事件,只能定义一个触发器;可以使用old和new来引用触发器中发生变化的记录内容。
        触发器SQL语法:
create trigger triggerName
after/before insert/update/delete on 表名
for each row   #这句话在mysql是固定的
begin
    sql语句;
end;
        推荐大家阅读:mysql之触发器trigger - 郑志伟
        同时使用Navicat for MySQL创建触发器方法如下图所示,但是建议使用语句操作。
        首先在Navicat for MySQL找到需要建立触发器对应的表,右键“设计表”,然后创建触发器。




二、简单的Insert触发器


        假设存在一张学生表(student),包括学生的基本信息,学号(stuid)为主键。

        另外存在一张成绩表(cj),对应每个学生包括一个值。其中number表示序号为主键,自动递增序列。它在插入过程中默认自增。同时假设成绩表中包括学生姓名和学号。


        该成绩表目前没有值,先需要设计一个触发器,当增加新的学生时,需要在成绩表中插入对应的学生信息,至于具体math、chinese、english后面由老师打分更新即可。
        那么,如何设计触发器呢?
        1.首先它是一个插入Insert触发器,是建立在表student上的;
        2.然后是after,插入后的事件;
        3.事件内容是插入成绩表,主需要插入学生的学号和姓名,number为自增,而成绩目前不需要。
        注意:new表示student中新插入的值。

create trigger ins_stu
after insert on student for each row 
begin
	  insert into cj ( stu_id, stu_name)
		values( new.stuid, new.username);
end;
        创建的触发器如下图所示:

  

        然后插入数据:
        insert student values ('eastmount','111111','6','1991-12-05');
        同时插入两个数据,触发器正确执行了~


        注意:创建触发器和表一样,建议增加判断:DROP TRIGGER IF EXISTS `ins_stu`;



三、判断值后调用触发器

        这里简单讲述几个判断插入类型的触发器。
        比如触发器调用,当插入时间小时为20时,对数据进行插入:

DROP TRIGGER IF EXISTS `ins_info`;
create trigger ins_info
after insert on nhfxelect for each row 
begin
	if HOUR(new.RecordTime)='20' then  
	insert into nhfxbyhour (UnitDepName, UnitDepCode, ElectCost, TimeJG, RecordTime)
		values( '数统学院', '1', new.USERKWH, '20', new.RecordTime);
	end if;
end;
        这个触发器中,RecordTime为datetime类型,如"2016-08-28 20:10:00",这时hour()这个值为20才能插入;否则数据不能插入。同时可以date_format(new.RecordTime, '%Y-%m-%d')判断日期为某天或某年某月进行插入。
        同时,再如更新触发器,如果设置的值为某个范围,才进行操作或性别为"男"或"女"才进行操作。
        基本语法:
        if 判断条件 then
           sql语句;
        end if;



四、Update触发器-实时更新


        假设存在一个实时插入数据的服务器,例如学生的消费金额或用电量等。
        StuCost:学生的用电数据,实时插入,Cost为每30秒消费金额,RecordTime为每分钟插入时间,datetime类型;
        StuCostbyHour:统计学生一小时的消费金额,HourCost为金额总数,按小时统计,TimeJD时间段,1~24,对应每小时,RecordTime为统计时间。
        现在需要设计一个实时更新触发器,当插入消费数据时,按小时统计学生的消费金额,同理,用电量等。
DROP TRIGGER IF EXISTS `upd_info`;
create trigger upd_info
after insert on StuCost for each row 
begin
	update StuCostbyHour set HourCost = HourCost + new.Cost
		where (TimeJD = hour(new.RecordTime) + 1) and date_format(new.RecordTime, '%Y-%m-%d') = date_format(RecordTime, '%Y-%m-%d');
end;
        SQL语句中,需要获取插入的时间,然后通过TimeJD时间段和日期RecordTime找到对应的值,然后进行累加即可。如下图所示:

  


        上图左边是实时插入数据,右边是触发器更新加和。后面会介绍MySQL实时事件:
        http://blog.csdn.net/zlp5201/article/details/38309095



五、触发器尽量避免


        下面简单参考知乎和CSDN论坛,简单讲解几个内容:
问题一:
         大型系统必须得要存储过程和触发器吗? - 知乎
回答1:        
        我们先要弄清楚二个问题:
        1.什么是大型系统?
        2.你讨论的是什么领域的应用,可以大致分为二种:互联网、企业内部
        接下来给你举一些例子:
        1.SAP、peopleSoft、ERP等企业级别应用
        一般情况下,会使用存储过程和触发器,减少开发成本,毕竟其业务逻辑修改频繁,而且为通用,很多时候会把一些业务逻辑编写成存储过程,像Oracle会写成包,比存储过程更强大。
        另外一个原因是服务器的负载是可控,也即系统的访问人数首先是可控的,没有那么大,而且这些数据又非常关键,为此往往使用的设备也比较好,多用存储柜子支撑数据库。
        2.另外一类互联网行业的
        比如淘宝、知呼、微博等,数据库的压力是非常大的,也往往会最容易成为瓶颈,而且多用PC服务器支撑,用户量的增速是不可控的,同时在线访问的用户量也是不可控的,为此肯定会把业务逻辑放到其他语言的代码层,而且可以借助一些LVS等类型软硬件做负载均衡,以及平滑增减Web层的服务器,从而达到线性的增减而支持大规模的访问。
        所以不管你的这个系统是否庞大,首先要分业务支持的对象,系统最可能容易出现瓶颈的地方在那?
        当然也不是说互联网行业的应用就绝对不用存储过程,这个也不对,曾在阿里做的Oracle迁移MySQL系统确实用了,因为历史的原因,另外还有一些新系统也有用,比如晚上进行定期的数据统计的一些操作,不过有量上的控制。存储过程是好东西,要分场景,分业务类型来用就可以把握好。

回答2:
        肯定不能一刀切的说能用或者不能用,不同类型的系统、不同的规模、不同的历史原因都会有不同的解决方案。
        一般情况下,Web应用的瓶颈常在DB上,所以会尽可能的减少DB做的事情,把耗时的服务做成Scale Out,这种情况下,肯定不会使用存储过程;而如果只是一般的应用,DB没有性能上的问题,在适当的场景下,也可以使用存储过程。
        至于触发器,我是知道有这东西但从来没用过。我希望风险可控,遇到问题能够快速的找到原因,尽可能不会去使用触发器。

回答3:
        1.PLSQL可以大大降低parse/exec 百分比;
        2.存储过程可以自动完成静态SQL variable bind;
        3.存储过程大大减少了JDBC网络传输与交互,速度快;
        4.oracle 中存储过程内部commit为异步写,一定程度上减少了等redo日志落地时间;
        5.存储过程最大问题就是给数据库开发工作压力太大,另外架构升级时候会比较难解耦;
        6.触发器不推荐使用,触发操作能在业务层解决就在业务层解决,否则很难维护,而且容易产生死锁。

问题2:
        为什么大家都不推荐使用MySQL触发器而用存储过程?- segmentfault
回答1:
        1.存储过程和触发器二者是有很大的联系的,我的一般理解就是触发器是一个隐藏的存储过程,因为它不需要参数,不需要显示调用,往往在你不知情的情况下已经做了很多操作。从这个角度来说,由于是隐藏的,无形中增加了系统的复杂性,非DBA人员理解起来数据库就会有困难,因为它不执行根本感觉不到它的存在。
        2.再有,涉及到复杂的逻辑的时候,触发器的嵌套是避免不了的,如果再涉及几个存储过程,再加上事务等等,很容易出现死锁现象,再调试的时候也会经常性的从一个触发器转到另外一个,级联关系的不断追溯,很容易使人头大。其实,从性能上,触发器并没有提升多少性能,只是从代码上来说,可能在coding的时候很容易实现业务,所以我的观点是:摒弃触发器!触发器的功能基本都可以用存储过程来实现。
        3.在编码中存储过程显示调用很容易阅读代码,触发器隐式调用容易被忽略。
        4.存储过程的致命伤在于移植性,存储过程不能跨库移植,比如事先是在mysql数据库的存储过程,考虑性能要移植到oracle上面那么所有的存储过程都需要被重写一遍。

回答2:
        这种东西只有在并发不高的项目,管理系统中用。如果是面向用户的高并发应用,都不要使用。
        触发器和存储过程本身难以开发和维护,不能高效移植。触发器完全可以用事务替代。存储过程可以用后端脚本替代。

回答3:
        我觉得来自两方面的因素:
        1.存储过程需要显式调用,意思是阅读源码的时候你能知道存储过程的存在,而触发器必须在数据库端才能看到,容易被忽略。
        2.Mysql的触发器本身不是很好,比如after delete无法链式反应的问题。
        我认为性能上其实还是触发器占优势的,但是基于以上原因不受青睐。


        最后希望这篇文章对你有所帮助,尤其是学习MySQL触发器的同学,你可以通过触发器实现一些功能,同时需要注意合理的使用触发器,但这个过程需要你不断的去积累和开发,才能真正理解它的用法和使用场所。
       (By:Eastmount 2016-08-28 下午2点   http://blog.csdn.net//eastmount/ )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[数据库] Navicat for MySQL触发器更新和插入操作 的相关文章

  • 插入 Mysql 表时防止 Json 排序

    在发送 AJAX 请求时 Json Content 的重新排序已经是一个已知问题 但我不知道在将 Json content 插入 JSON 类型的 Mysql 表时也会发生同样的情况 在这种情况下 mysql 服务器在保存之前也会对其内容进
  • 重新启动我的 sql 时,jenkins 失败“sudo:不存在 tty,并且未指定 Askpass 程序 抱歉,请重试。”

    我刚刚配置了 jenkins 在预构建步骤中我尝试重新启动 jenkins 但最终出现以下错误 Commencing build of Revision c5b9f8daac092efc5396d80f568a2cf89ae8b697 or
  • 如何使用 MySQL 和 PHP 在数据库中存储标签?

    我想创建一个数据库来存储用户为其问题输入的标签 然后为发布的每个单独问题显示所有标签 像这里这样的东西 这是现在为我做所有事情的表 CREATE TABLE questions tags id INT UNSIGNED NOT NULL A
  • 使用java在mysql中插入带有\\的文件路径

    我正在使用java制作一个独立的应用程序 并且我需要插入用户从文件选择器中选择的图像的路径 我正在获取文件的路径 但是当我将其存储在数据库 mysql 中时 它不会存储 所以当我检索该路径时 该文件不会显示 如何存储文件的路径 这样就可以使
  • Python MySQL 模块

    我正在开发一个需要与 MySQL 数据库交互的 Web 应用程序 但我似乎找不到任何真正适合 Python 的模块 我特别寻找快速模块 能够处理数十万个连接 和查询 所有这些都在短时间内完成 而不会对速度产生重大影响 我想我的答案将是游戏领
  • Laravel 中的 SQL 运算符是什么?

    我正在查看 Laravel 的源代码 发现了很多 Eloquent 的 SQL 运算符 我想知道其中一些是什么以及如何使用它们 不幸的是我没有找到任何文档 这是我找到的运营商vendor laravel framework src Illu
  • 像搜索一样在mysql中包含空格

    我在某些情况下使用 mysql like 关键字时遇到问题 我的要求是这样的 首先 当我搜索时 ABC 结果应该找到ABC and ABCdef但不是xyzABCdef or xyzABC 乍一看使用起来很简单ABC 但在我搜索时的情况 h
  • 我们可以使用 Skip()、Take() 和 OrderBy() 控制 LINQ 表达式顺序吗

    我正在使用 LINQ to Entities 来显示分页结果 但我在组合方面遇到了问题Skip Take and OrderBy calls 一切正常 除了OrderBy 分配得太晚了 它在结果集被削减后执行Skip and Take 因此
  • Yii2 从 MySQL 中的表登录的分步指南

    我开始在 Yii2 中迈出第一步 到目前为止 我已经能够编写一个应用程序并将数据库中的表连接到它 就像我在 Yii1 中学到的那样 该表是contacts我的创建视图中的表单将数据发送到数据库 没有任何问题 问题是我只能在 Yii2 内置的
  • 导入mysql数据库出错

    我导出我的数据库并导出到另一台计算机使用 phpmyadmin 但它错误 静态分析 分析过程中发现2处错误 意想不到的角色 靠近位置 53 的 无法识别的语句类型 位置 1 的 div 附近 SQL查询 div class error h1
  • 在评论中查找不同风格的日期

    我还有一个问题要问preg match 我有一个表 其中评论的日期写在评论本身内 手动 现在我需要提取该日期并将其放置在不同的列中 我发现评论和日期的样式如下 id warning sent warning date 6109 2011 0
  • 选择列表包含非聚合列

    自从更新 MySQL 以来 我注意到以下查询失败 SELECT u p name as plan COUNT u id as totalprojects FROM users u LEFT JOIN plans p ON p id acce
  • 如何在mysql中设置“performance_schema on”?

    我想转performance schemaON 在 mysql 中收集统计信息 我怎样才能实现这个目标 以下指南是特定于 Linux 的 但应该很容易适用于 Windows 您必须检查 mysql 服务器二进制文件是否已编译为支持它 mys
  • 关于mysql建表的几个问题

    CREATE TABLE favorite food person id SMALLINT UNSIGNED food VARCHAR 20 CONSTRAINT pk favorite food PRIMARY KEY person id
  • 如何使用WAMP登录phpMyAdmin,用户名和密码是什么?

    根 这个词是什么意思php我的管理员 http en wikipedia org wiki PhpMyAdmin 每当我写作时localhost phpmyadmin在地址栏上 我被要求输入用户名和密码 但我不知道它们是什么 我不记得何时何
  • java.sql.SQLException:已经关闭

    我们有一个在 Tomcat 上运行的 Web 应用程序 带有 MySQL 后端 有一段时间一切都很好 然后突然我们开始遇到这个异常java sql SQLException Already closed 整个堆栈跟踪是 DEBUG org
  • 将 .NET 小数存储到 MySQL 中的最佳字段定义是什么?

    我需要将小数存储到 MySQL 中 它可以具有不同的精度 因此我很想知道哪种 MySQL 字段类型绝对等同于 NET 的字段类型decimal http msdn microsoft com en us library system dec
  • 多人/单人测验游戏的数据库设计

    我在这里看到了很多问题 但没有人适合我的问题 我正在尝试创建一个可扩展的 ER 模型 如果我想添加更多数据 则不会破坏几乎任何东西 所以我尝试创建的是 有两种类型的用户 比如说管理员和工作人员 他们有不同的角色 管理员可以对问题进行 CRU
  • 数据库设计 - “推”模型,或写时扇出

    背景信息 我正在尝试检索我关注的人的图像 按最新时间排序 它就像 Twitter 新闻源 显示您朋友的最新动态 Plans 目前我只需要考虑一项 那就是图像 将来我计划分析用户的行为并将他们可能喜欢的其他图像添加到他们的提要中等 http
  • MySql 西班牙语字符数据

    我有一个包含西班牙语字符的数据库 为了填充数据库 我从字符编码 UTF 8 的客户端页面获取值 当我在 mySql 数据库中插入值时 行包含更改的数据 例如 如果我插入 M xico 数据库中的条目是 M xico 其影响是当我对指定 M

随机推荐

  • 关于遗传算法

    关于遗传算法 有很多袋鼠 它们降落到喜玛拉雅山脉的任意地方 这些袋鼠并不知道它们的任务是寻找珠穆朗玛峰 但每过几年 就在一些海拔高度较低的地方射杀一些袋鼠 于是 不断有袋鼠死于海拔较低的地方 而越是在海拔高的袋鼠越是能活得更久 也越有机会生
  • STM32 使用STM32F103控制无源蜂鸣器发声播放音乐

    使用STM32控制无源蜂鸣器发声播放音乐 注 学习STM32总结做的笔记 大神勿喷 有不足之处还望不吝赐教 本篇大部分转载而来 有侵权请联系作者 谢谢 原博客地址 https blog csdn net fanxp66 article de
  • Vue3+TypeScript+Router+Vuex+Ant-Design-Vue项目(四)—— vue-router 基本配置

    App vue 修改 App vue 文件
  • 总结伪类与伪元素

    熟悉前端的人都会听过css的伪类与伪元素 然而大多数的人都会将这两者混淆 本文从解析伪类与伪元素的含义出发 区分这两者的区别 并且列出大部分伪类与伪元素的具体用法 即使你有用过伪类与伪元素 但里面总有一两个你没见过的吧 1 伪类与伪元素 先
  • python每日一题

    输入一个字符串 将其中的小写字母转换成大写字母 并输出转换后的结果 s input 请输入一个字符串 result for c in s if c islower result c upper else result c print 转换后
  • 路由器工作原理

    一 路由器工作原理 1 什么是路由器 路由器的定义 是实现网络互连设备 工作在网络层 路由器的功能 路由和转发 1 可以决定数据包从来源端到目的端所经过的路由路径 host到host之间的最佳传输路径 这个过程称为路由 2 将路由器输入端的
  • [Android]【安卓】Service详解

    Android 安卓 Service详解 本篇博客已收录到我的安卓开发小结中 点击 安卓开发小结 参考资料 Android总结篇系列 Android Service 第一行代码 Android总结篇系列 Android Service Se
  • Qt中主线程如何不优雅地结束掉一个被卡死的子线程

    前提 这里所说的子线程其实是一个类 使用如下代码让其实例化对象运行在单独的线程中 例如是一个class A 如下代码中m thread是在 h文件里声明 其余代码是在A的构造函数中 QThread m thread this gt move
  • 支付宝小程序中网络请求 my.request({}) 的用法

    支付宝小程序网络请求官方文档 https docs alipay com mini api network Page data name 支付宝小程序 onLoad query 页面加载 在这里请求接口 console info Page
  • 2022年9月电子学会C语言等级考试试卷(四级)答案解析

    一 上升子序列 一个数字的序列b i 当b 1 lt b 2 lt lt b S的时候 我们称这个序列是上升的 对于给定的一个序列 a
  • visual studio 2022换背景遇到的问题

    如果要自定义背景图 则可以下载ClaudialIDE 1 在拓展 gt 点击拓展管理 gt 右上角搜索background gt 点击下载ClaudialIDE gt 加载完之后需要关闭vs界面进行下载 下载失败 弹出 由于出现以下错误 无
  • html ul纵向不换行,ul li列表并排 不换行css布局

    如何使用CSS样式让ul li列表标签布局并排显示不换行篇 默认ul li布局竖列显示 这里CSS5介绍使用两种使用css样式让li标签布局并排显示 一种使用css display 另外一种使用css float浮动 一 使用display
  • GitWeb

    本文转载至 http www gitchina org getting started pro git gitweb html 现在我们的项目已经有了可读可写和只读的连接方式 不过如果能有一个简单的 web 界面访问就更好了 Git 自带一
  • 算法_统计二叉树第k层的结点个数

    统计第k层的结点个数 全局变量版 int cnt 0 void count node k BTNode bt int k int h if bt NULL return else if h k cnt else if h lt k coun
  • 应用pca和K-means实现用户对物品类别的喜好细分划分

    学习目标 应用pca和K means实现用户对物品类别的喜好细分划分 数据如下 order products prior csv 订单与商品信息 字段 order id product id add to cart order reorde
  • python中的类的基本概念

    主要参考博客 https www cnblogs com chengd articles 7287528 html 以下内容主要摘抄以上博主博客 一 基本概念 类 就是类似于C 中的类 类变量 类变量在整个实例化的对象中是公用的 类变量定义
  • 华为HCIE云计算之FA云桌面发放(Microsoft AD方式)

    华为HCIE云计算之FA云桌面发放 windowsAD方式 一 检查FC状态 二 FA01虚拟机安装FA组件 1 一键安装FA组件 选择Microsoft AD模式 2 配置本地服务器IP 3 查看组件安装状态 三 FA02虚拟机安装VAG
  • 软件测试基础(三)代码检查与走查

    两种主要的人工测试方法 都是以一组人员为单位 用于代码检查的错误列表 1 数据引用错误 2 数据声明错误 3 运算错误 4 比较错误 5 控制流程错误 6 接口错误 7 输入输出错误 代码走查与检查
  • HTML5的魅力,10个Demo展示

    Flash和HTML5的比较已经成为现在最热门的主题之一 我们不去争论哪个好哪个不好 和HTML5在很酷的动画和简单的游戏等方面一样 除非HTML5在未来几年有一些重大发展 否则Flash在富内容网页应用和游戏方面永远是不错的选择 下面收集
  • [数据库] Navicat for MySQL触发器更新和插入操作

    一 触发器概念 触发器 trigger 监视某种情况 并触发某种操作 它是提供给程序员和数据分析员来保证数据完整性的一种方法 它是与表事件相关的特殊的存储过程 它的执行不是由程序调用 也不是手工启动 而是由事件来触发 例如当对一个表进行操作