MySQL进阶——触发器

这篇具有很好参考价值的文章主要介绍了MySQL进阶——触发器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.触发器定义

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

2. 创建触发器语法

CREATE TRIGGER trigger_name trigger_time trigger_event

ON table_name FOR EACH ROW 

trigger_body

trigger_time:触发器触发时机,有before和after

trigger_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_t1
AFTER DELETE ON student
FOR EACH ROW
BEGIN 
	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_s
AFTER UPDATE ON student
for EACH ROW
BEGIN
	UPDATE grade SET studentid = new.studentid WHERE studentid = old.studentid;
END

3.1.4 INSERT

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

CALL p_tao();

未调用存储过程前:

mysql创建触发器,数据库

调用存储过程后:

mysql创建触发器,数据库 

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,则自动调整成3000
CREATE TRIGGER tdt 
BEFORE INSERT 
ON teacher
for each ROW
BEGIN
	if 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 UPDATE
ON grade
FOR EACH ROW
BEGIN
	IF new.grade<60	THEN SET new.credit = 0;
	ELSE SET new.credit = (
		SELECT credit
		FROM coure
		WHERE courseid = new.courseid
	);
	END if;
END

UPDATE 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_trigger
AFTER INSERT
ON b_student
for EACH ROW
BEGIN
	UPDATE b_class SET num = num + 1 WHERE Cid = new.classid;
END;


#创建抛出自定义异常的触发器,当插入学生人数超过4人时,就会抛出异常。
CREATE TRIGGER exception BEFORE INSERT ON b_student for each row
BEGIN
	DECLARE number int;
	SELECT num INTO number from b_class WHERE cid = new.classid;
	if number = 4  THEN	SIGNAL 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','刘洋');

插入学生信息之前:

mysql创建触发器,数据库

插入学生信息之后:

mysql创建触发器,数据库 

6. 查看触发器

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

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

7. 删除触发器

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

DROP TRIGGER trigger_name

mysql创建触发器,数据库

 文章来源地址https://www.toymoban.com/news/detail-763053.html

到了这里,关于MySQL进阶——触发器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL数据库触发器

    查看触发器是指查看数据库中已经存在的触发器的定义、状态和语法信息等。MySQL 中查看触发器的方法包括 SHOW TRIGGERS 语句和查询 information_schema 数据库下的 triggers 数据表等。本节将详细介绍这两种查看触发器的方法。 SHOW TRIGGERS语句查看触发器信息 在 MySQL 中,可以通过 S

    2023年04月12日
    浏览(48)
  • MySQL——超详细数据库触发器教程

    目录 一、触发器的概念 二、创建触发器 三、查看触发器 四、删除触发器 总结         在实际开发中往往会碰到这样的情况:         当我们对一个表进行数据操作时,需要同步对其它的表执行相应的操作,正常情况下,如果我们使用sql语句进行更新,将需要执行多

    2024年02月07日
    浏览(68)
  • Mysql数据库实验报告--实验五 存储过程和触发器

    在这个系列会更新一些最近老师要求写的实验报告~ 大家尽量对着我的文章做一个参考,不要盲目的cv,毕竟这个对于我们以后的工作学习还是十分重要的。 从这个实验开始,就不在cmd命令行里面进行mysql数据库的操作,因为代码长度和代码的复杂性,需使用 MySQL Workbench: 双

    2024年02月09日
    浏览(68)
  • MySQL | MySQL触发器

    目录 一、创建触发器 1.2 创建只有一个执行语句的触发器 1.2 创建有多个执行语句的触发器 二、查看触发器 2.1 利用SHOW TRIGGERS语句查看触发器信息 2.2 在triggers表中查看触发器信息 三、删除触发器 触发器是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,

    2024年02月14日
    浏览(42)
  • 数据库24:触发器的创建和使用(头歌云课)

      任务描述 相关知识 触发器的定义 触发器和存储过程的区别 触发器的优点 触发器的作用 触发器的分类 DML触发器 DDL触发器 登录触发器 触发器的工作原理 inserted表 deleted表 创建触发器 编程要求 测试说明 任务描述 本关任务:通过实验,加深对数据完整性的理解,掌握创建

    2024年02月05日
    浏览(84)
  • MySQL-触发器

    目录 🍁触发器简介 🍁创建触发器 🍃创建 BEFORE 类型触发器 🍃创建 AFTER 类型触发器 🍁删除触发器(DROP TRIGGER) 🍃删除触发器 🍁语法总结 🍃insert 🍃delete 🍃update 🦐:MySQL专栏         MySQL 数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CAL

    2024年01月16日
    浏览(42)
  • MySQL 触发器

    触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。 使用别 名OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库

    2024年02月08日
    浏览(44)
  • MySQL---存储函数、触发器

    1. 存储函数 MySQL 存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算 或功能写成一个函数。 存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合。 存储函数与存储过程的区别: 存储函数有且只有一个返回值,而存储过程可

    2024年02月05日
    浏览(81)
  • MySQL存储过程和触发器

    存储过程和触发器是数据库中用于执行特定任务的两种重要的数据库对象。它们由SQL语句组成,被预先编译并存储在数据库中,可以通过调用来执行。以下是对存储过程和触发器的简要说明以及如何创建和使用它们: 存储过程(Stored Procedure): 定义: 存储过程是一组SQL语句

    2024年01月21日
    浏览(66)
  • MySQL 存储过程&触发器&事务

    存储过程(Stored Procedure),是为了完成特定功能的SQL语句集。 存储过程可以理解为shell脚本这类型的命令集输出工具,但是在底层,存储过程拥有更多的优点: 语言的灵活性跟功能性更强 ,在原有基础之上可以插入 控制语句、循环语句等 让SQL语句的功能更强,能够完成更

    2024年02月04日
    浏览(71)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包