首页 > 数据库 >12-MySQL数据库的触发器

12-MySQL数据库的触发器

时间:2023-07-30 22:16:03浏览次数:41  
标签:语句 insert 触发器 12 数据库 update MySQL

12-MySQL数据库的触发器

课程目标

了解触发器简介。

掌握MySQL触发器的创建和使用以及删除。

12.1触发器简介

触发器是一个被指定关联到一个表的数据库对象,当对一个表的特定事件(例如增、删、改、查表中记录)出现时,它将会被激活。触发器具有MySQL语句在需要时才被执行的特点,即某条(或某些)MySQL语句在特定事件发生时自动执行。例如:

每当增加一个客户到数据库的客户基本信息表时,都检查其QQ号码的格式是否正确。

每当向客户销售一个产品时,都从产品库存量中减少库存的数量。

每当删除客户基本信息表中一个客户的全部基本信息数据时,该客户所订购的未完成订单信息也应该被自动删除。

无论何时删除一行,都在数据库的存档表中保留一个副本。

触发器与表的关系十分密切,用于保护表中的数据。当有操作影响到触发器所保护的数据时,触发器就会被自动执行,从而保障数据库中数据的完整性,以及多个表之间数据的一致性。

具体而言,触发器就是MySQL响应insert、update和delete语句而自动执行的一条MySQL语句(或位于begin和end语句之间的一组MySQL语句)。需要注意的是,其它MySQL语句是不支持触发器的。

12.2 触发器的创建和使用

1. 创建触发器的语法如下:

create trigger 数据库名.触发器名 触发时刻 触发事件on 表名

for each row 触发器的动作主体

语法说明如下:

1).关于触发器名:即触发器在所在数据库的唯一标识。

2).关于触发时刻:它有两个选项,即before和after,用于表示触发器是在激活它的语句之前或者之后触发。如果希望验证新数据是否满足使用的限制,则使用before选项;如果希望在激活触发器的语句执行之后完成几个或更多的改变,通常使用after选项。

3).关于触发事件:用于指定激活触发器的语句的种类,其可以是下述值之一:

①insert:将新行插入表时激活触发器。例如,通过MySQL的insert语句。

②update:更改表中某一行时激活触发器。例如,通过MySQL的update语句。

③delete:从表中删除某一行时激活触发器。例如,通过MySQL的delete语句。

4).关于表名:与触发器相关联的表名,必须引用永久性表,不能将触发器与临时表或视图关联起来。在该表上触发事件时才会激活触发器。同一个表不能拥有两个具有相同触发时刻和事件的触发器。例如,对于一张数据表,不能同时有两个before update触发器,但可以有一个before update触发器和一个before insert触发器,或一个before update触发器和一个after update触发器。

5).for each row:这个声明用来指定对于受触发事件影响的每一行都要激活触发器的动作。例如,使用一条insert语句向一个表中插入多地数据时,触发器会对每一行数据的插入都执行相应的触发器动作。

6).关于触发器的动作主体:即包含触发器激活时将要执行的MySQL语句。如果要执行多个语句,可使用begin…end复合语句结构。

注意,在触发器的创建中,每个表每个事件每次只允许一个触发器。因此,每个表最多支持6个触发器,即每条insert、update和delete的之前和之后。单一触发器不能与多个事件或多个表相关联,例如,需要一个对insert和update操作执行的触发器,则应该定义两个触发器。

2.查看和使用触发器的语法如下:

show triggers [{from | in} 数据库表]

例:在数据库huike中的表emp中创建一个触发器t1,用于向表emp中插入一行数据的同时也向dept表中插入一行数据。

delimiter //

create trigger huike.t1 before insert on emp for each row

begin

insert into dept values(50,'HR','BEIJING');

end //

注:delimiter 符号,其功能是改变输入结束符。在MySQL中默认的语句输入结束符是“;”,现在通过delimiter语句将默认的输入结束符“;”修改为“//”。

12.3 触发器的删除

和删除数据库、删除表格一样,删除触发器的语法如下:

drop trigger [IF EXISTS] 数据库名.触发器名

例:删除数据库huike中的表emp中的触发器t1。

delimiter //

drop trigger huike.t1

end //

12.4 本章小结

本章主要阐述了MySQL数据库中的触发器。

标签:语句,insert,触发器,12,数据库,update,MySQL
From: https://www.cnblogs.com/zxbin/p/17592161.html

相关文章

  • 11-MySQL数据库的存储过程
    11-MySQL数据库的存储过程课程目标了解存储过程简介、关于MySQL的存储过程。掌握MySQL存储过程的创建、调用、查询、修改、删除、控制语句、基本函数。11.1存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(StoredProcedure)是一组为了完......
  • Mysql添加用户并授权
     添加新用户test,设置任意ip登录,密码:qwe123>CREATEUSER'test'@'%'IDENTIFIEDBY'qwe123';授权test账户select,insert操作权限至数据库order全部数据表>GRANTselect,insertONorder.*TO'test'@'%';执行后刷新权限才能生效> FLUSHPRIVILEGE......
  • 【题解】[ABC312E] Tangency of Cuboids(adhoc)
    【题解】[ABC312E]TangencyofCuboids少见的at评分\(2000+\)的ABCE题,非常巧妙的一道题。特别鸣谢:@dbxxx给我讲解了他的完整思路。题目链接ABC312E-TangencyofCuboids题意概述给定三维空间中的\(n\)个长方体,每个长方体以其一条体对角线的两个端点的坐标形式......
  • Mysql数据库常用操作命令
    //创建数据库>create databasedatabase_name;eg;createdatabasesorder;>useorder;//选择数据库>showtables;//显示数据库order创建的所有数据表>dropdatabaseorder;//删除数据库order,删除数据库后,数据表中的数据会全部被删除,所以删除前一定要做好数据......
  • 为Win12做准备?微软Win11 23H2将集成AI助手:GPT4免费用
    微软日前确认今年4季度推出Win1123H2,这是Win11第二个年度更新。Win1123H2具体有哪些功能升级,现在还不好说,但它会集成微软的Copilot,它很容易让人想到多年前的“曲别针”助手,但这次是AI技术加持的,Copilot就是BingAI聊天的Windows桌面版,基于GPT-4打造,它可以帮助你自动化各种任务,......
  • [ABC312] 题解 [D~Ex]
    [ABC312]题解[D~Ex]D-CountBracketSequences一个括号序列\(s\)包含(,),?,?可以填任意括号,问你填完后有多少种合法序列方式。这是一个Classical的括号序列DP,使用这个状态表示可以解决很多括号序列问题:\(dp[i][j]\)表示已经摆好了前\(i\)个字符,有\(j\)个没......
  • mysql 简单进阶 ———— 重构查询[二]
    前言简单整理一下重构查询。正文为什么我们需要重构查询,原因也很简单,那就是查询慢。为什么会查询慢?查询性能慢底下的最基本的原因是访问的数据太多。某些查询不可避免地需要筛选大量的数据,但这并不常见。大部分性能低下的查询都可以通过减少访问的数据流的方式进行优化。......
  • MySQL使用binlog恢复数据
    1.什么是BinlogMySQL的二进制日志(Binlog)是一种事务日志,用于记录对数据库的更改操作。Binlog主要用于MySQL复制和恢复:复制:从库通过拉取主库的binlog实现主从数据一致恢复:通过重放binlog恢复数据丢失或误操作情况1.1.Binlog的工作原理在MySQL中,每个事务都会在提交后......
  • vivado生成Bitstream报错[Vivado 12-1345] Error(s) found during DRC. Bitgen not ru
    写了一个很简单的程序,2-4译码器。moduledecoder2to4(inputin1,in0,outputreg[3:0]out);always@(*)beginif({in1,in0}==2'b00)out=4'b1111;elseif({in1,in0}==2'b01)out=4......
  • 通过Redis+Mysql来自定义Spring-Statemachine的持久化
    我们在使用Spring状态机的时候,往往需要对于StateMachine持久化操作,但是官方为我们提供的基于redis的持久化并不是特别好,一方面是因为只存redis容易导致数据丢失,另一方面因为状态机的特性需要对应的StateMachine的数据永久有效,导致redis中的key永不过期。我现在希望实现将StateMac......