我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL进阶——触发器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL进阶——触发器

1.触发器定义

同存储过程和函数类似,MySQL中的触发器也是存储在系统内部的一段程序代码,可以把它看作是一个特殊的存储过程。所不同的是,触发器无需人工调用,当程序满足定义条件时就会被MySQL自动调用。这些条件可以称为触发事件,包括INSERT、UPDATE和DELETE操作。

2. 创建触发器语法

CREATE TRIGGER trigger_name trigger_time trigger_eventON table_name FOR EACH ROW trigger_bodytrigger_time:触发器触发时机,有before和aftertrigger_event:触发器触发事件,有insert,update,delete三种trigger_body:触发器主体语句

从MySQL5.7开始,可以为一张表定义具有相同触发事件和触发时机的多个触发器。默认情况下,具有相同触发事件和触发时机的触发器按其创建顺序激活。

3. 触发器

3.1 after触发器

AFTER触发器是指触发器监视的触发事件执行之后,再激活触发器,激活后所执行的操作无法影响触发器所监视的事件。

3.1.1 delete触发器

建一个触发器t_d_s,当删除表student中某个学生的信息,同时将grade表中与该学生有关的数据全部删除。

CREATE TRIGGER trigger_t1AFTER DELETE ON studentFOR EACH ROWBEGIN DELETE FROM grade WHERE studentid = old.studentid;END

3.1.2 new和old

触发器不会产生new表和old表,所谓new,old只是指insert,delete,update操作执行前的所在表状态和执行后的状态

对insert而言,只有new合法,新插入的行用new来表示,行中每一列的值用new.列名来表示

对于delete而言,只有old合法,删除的行用old来表示,行中每一列的值用old.列名来表示

对于update而言,被修改的行,修改前的数据,用old来表示,old.列名;修改后的数据,用new来表示,new.列名

3.1.3 UPDATE

创建一触发器t_u_s,实现在更新学生表的学号时,同时更新grade表中的相关记录的studentid值。

CREATE TRIGGER t_u_sAFTER UPDATE ON studentfor EACH ROWBEGINUPDATE grade SET studentid = new.studentid WHERE studentid = old.studentid;END

3.1.4 INSERT

  1. 创建一个存储过程,根据student表中数据,一次性更新class表中每个班的人数
CREATE PROCEDURE p_tao()BEGINDECLARE num int;DECLARE cid VARCHAR(20);DECLARE done boolean DEFAULT true;DECLARE cur CURSOR FORSELECT classid,COUNT(*)FROM studentGROUP BY classid;DECLARE CONTINUE HANDLER FOR NOT found SET done = false;UPDATE class set studentnum = 0;OPEN cur;FETCH cur INTO cid,num;WHILEdone DOUPDATE class SET StudentNum = num WHERE classid = cid;FETCH cur INTO cid,num;END WHILE;CLOSE cur;ENDCALL p_tao();

未调用存储过程前:

调用存储过程后:

 

4.2 before触发器

BEFORE触发器是指触发器在所监视的触发事件执行之前激活,激活后执行的操作先于监视的事件,这样就有机会进行一些判断,或修改即将发生的操作。

Before与After区别:

before:(insert、update)可以对new进行修改,after不能对new进行修改,三者都不能修改old数据。

4.2.1 INSERT

给teacher表创建一个列, salary列,记录教师的工资

建一个触发器t_d_t,插入教师信息时,如果教师工资小于3000,则自动调整成3000

#给teacher表创建一个列, salary列,记录教师的工资ALTER table teacher ADD salary int;#建一个触发器tdt,插入教师信息时,如果教师工资小于3000,则自动调整成3000CREATE TRIGGER tdt BEFORE INSERT ON teacherfor each ROWBEGINif new.salary <3000 THEN SET new.salary = 3000;  END if;END;INSERT INTO teacher(TeacherID,Teachername,sex,salary) VALUES('123','位老师','女',2999);INSERT INTO teacher(TeacherID,Teachername,sex,salary) VALUES('124','文老师','男',3001);

4.2.2 UPDATE

给grade表建立一个学分列,并创建一个触发器,当修改grade表中数据时,如果修改后的成绩小于60分,则触发器将该成绩对应的课程学分修改为0,否则将学分改成对应课程的学分

ALTER TABLE grade ADD credit int;CREATE TRIGGER trigger_ch BEFORE UPDATEON gradeFOR EACH ROWBEGINIF new.grade<60THEN SET new.credit = 0;ELSE SET new.credit = (SELECT creditFROM coureWHERE courseid = new.courseid);END if;ENDUPDATE grade SET grade = 50 WHERE courseid ="Dp010001" AND studentid = "St0109010003"

5. 中断触发器

假设软件B1802班级最多只能有4个人,当往b_student表中增加新生信息时,b_class班级表内学生人数会随之增加,当人数大于4人时,由于超过人数限制,会报系统错误,错误提示为“超过人数限制”,并且该触发器所有操作(包括引发触发器的操作)均不能成功。

#创建b_classs表存放班级人数,如果班级人数大于4就提示"超出人数限制"CREATE TABLE B_class(Cid VARCHAR(20) PRIMARY KEY  COMMENT "班级名称",num int COMMENT "人数");#插入初始数值,初始数值软件B1802班没有人INSERT INTO b_class VALUES("软件B1802",0);#创建一个b_student表存放学生信息CREATE TABLE b_student(studentid VARCHAR(20) PRIMARY KEY COMMENT "学号",studentname VARCHAR(20) not null COMMENT "姓名",classid VARCHAR(20)  DEFAULT '软件B1802' COMMENT "班级",CONSTRAINT FK_ID FOREIGN KEY(classid) REFERENCES B_class(Cid)ON DELETE RESTRICT on UPDATE CASCADE)DEFAULT CHARSET = utf8;#要注意的是,我们在插入学生信息的时候,我们要使用触发器来更新班级表中的人数,不然尽管你在学生信息表插入多条数据,班级表中的人数会一直保持不表,也就不会出现超出人数限制的情况。CREATE TRIGGER add_triggerAFTER INSERTON b_studentfor EACH ROWBEGINUPDATE b_class SET num = num + 1 WHERE Cid = new.classid;END;#创建抛出自定义异常的触发器,当插入学生人数超过4人时,就会抛出异常。CREATE TRIGGER exception BEFORE INSERT ON b_student for each rowBEGINDECLARE number int;SELECT num INTO number from b_class WHERE cid = new.classid;if number = 4  THENSIGNAL SQLSTATE '45000'SET message_text = '超出人数限制',MYSQL_ERRNO = 1333;END if;END;INSERT INTO b_student(studentid,studentname) VALUES('238','位傲气'),('239','阮氏问'),('240','王陇镇'),('250','周志豪');INSERT INTO b_student(studentid,studentname) VALUES('241','刘洋');

插入学生信息之前:

插入学生信息之后:

 

6. 查看触发器

在MySQL5.7以前,对同一个表相同触发时机的相同触发事件,只能定义一个触发器。例如,对于某个表的不同字段的AFTER更新触发器,只能定义成一个触发器,在触发器中通过判断更新的字段进行相应的处理。所以在创建触发器之前,最好能够查看MySQL中是否已经存在该触发器。

MySQL中,查看触发器有两种方法,一种是使用SHOW TRIGGERS语句,一种是SHOW CREATE TRIGGERS TRIGGERNAME 查看触发器的详细信息。

7. 删除触发器

使用DROP TRIGGER语句可以删除MySQL中定义的触发器,基本语法形式如下:

DROP TRIGGER trigger_name

 

来源地址:https://blog.csdn.net/m0_73703409/article/details/128785882

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL进阶——触发器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【MySQL】数据库进阶之触发器内容详解

💁 个人主页:黄小黄的博客主页 ❤️ 支持我:👍 点赞 🌷 收藏 🤘关注 🎏 格言:一步一个脚印才能承接所谓的幸运 本文来自专栏:MySQL8.0学习笔记
2023-08-30

数据库触发器进阶指南:揭秘触发器的强大功能

数据库触发器是一种允许您在数据库操作(如插入、更新或删除)发生时自动执行动作的机制。它提供了增强数据库完整性、实现业务逻辑和提高性能的强大功能。本指南将深入探讨触发器的概念、类型、创建和管理,并通过演示代码揭示触发器的强大功能。
数据库触发器进阶指南:揭秘触发器的强大功能
2024-02-08

MySQL 触发器

文章目录 1.简介2.行级与语句级触发器3.触发时机4.触发器优缺点5.创建触发器语法示例 6.查看触发器7.删除触发器参考文献 1.简介 触发器(Trigger)是与表关联的命名数据库对象,当表发生特定事件时激活。 触发器
2023-08-30

MySQL触发器

1、 触发器定义:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delet
MySQL触发器
2019-06-10

MySQL——触发器

基本语法 //创建触发器CREATE TRIGGER name//删除触发器DROP TRIGGER name 创建触发器 在创建触发器时需要给出4条信息 唯一的触发器名 触发器需要关联的表 触发器应该响应的活动(DELETE、INSTERT或UPDA
MySQL——触发器
2020-02-06
2024-04-02

mysql触发器的三种触发事件

mysql触发器在特定事件发生时执行动作,有三种触发事件:1. before:在操作发生前触发,允许检查数据或更新其他表;2. after:在操作发生后触发,允许发送通知或分析数据;3. instead of:替代操作,允许完全控制对表的修
mysql触发器的三种触发事件
2024-08-01

Mysql进阶

一、约束目的:使得数据更准确,更完整。约束的分类:键约束主键约束唯一键约束外键约束非空约束默认值约束自增约束检查约束(mysql暂时没有支持)二、主键约束(一)概述关键字 :primary key特点:增加主键约束的列(字段)的值必须是非空 + 唯一的,一个表
Mysql进阶
2015-09-13

Mysql中的触发器

阅读目录什么是触发器特点及作用例子:创建触发器,记录表的增、删、改操作记录弊端什么是触发器简单的说,就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行;特点及作用特点:触发事件的操作和触发器里的SQL语句是一个事务
Mysql中的触发器
2018-09-20

如果 MySQL 中存在触发器,则删除触发器?

要删除触发器,请使用DROP命令。语法如下 −DROP TRIGGER IF EXISTS yourTriggerName;为了理解上述语法,您需要在当前数据库中有一个触发器。要检查触发器是否存在,您可以使用以下查询。我们的数据库中有一个触
2023-10-22

mysql触发器有几种

mysql提供两种类型的触发器:行级和语句级。行级触发器在单个行操作(插入、更新、删除)时触发,可分为 before、after、instead of 三种;语句级触发器在多行操作(insert、update、delete、merge)时触
mysql触发器有几种
2024-08-02

mysql触发器的作用

触发器是一种数据库对象,可在表上的特定事件(插入、更新或删除)发生时自动执行 sql 语句。其作用包括:维护数据完整性,确保表中数据符合特定规则自动执行任务,如发送电子邮件、更新其他表实现复杂的业务逻辑提高性能,避免重复执行相同任务MySQ
mysql触发器的作用
2024-08-06

编程热搜

目录