Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL中触发器的使用

MySQL中触发器的使用

作者头像
xbhog
发布于 2020-12-10 02:46:02
发布于 2020-12-10 02:46:02
3.8K00
代码可运行
举报
文章被收录于专栏:开发技能乱炖开发技能乱炖
运行总次数:0
代码可运行

触发器:

触发器的使用场景以及相应版本:

触发器可以使用的MySQL版本:

  • 版本:MySQL5以上

使用场景例子:

  1. 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写
  2. 每当订购一个产品时,都从库存数量中减去订购的数量
  3. 无论何时删除一行,都在某个存档表中保留一个副本

即:在某个表发生更改时自动处理。

如遇到触发器报错“Not allowed to return a result set from a trigger”;请划到最后看详解;

触发器的使用:

创建基本的触发器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TRIGGER newproduct AFTER INSERT on products FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100);
 SET msg = "products added";
 SIGNAL SQLSTATE 'HY000' SET message_text = msg;
 
END

结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSERT INTO products VALUES('demo2','1003','xiaoguo','66.6','hello world')
> 1644 - products added
> 时间: 0.035s

解释:

首先创建一个触发器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#newproduct  触发器的名字
CREATE TRIGGER newproduct

触发的时机:

BEFORE:触发器在触发他们的语句之前触发

AFTER:触发器在触发他们的语句完成后触发

在这里我们使用的after;也就是在插入结束后触发条件;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE msg VARCHAR(100);

注意:declare语句是在复合语句中声明变量的指令;如果不声明msg,执行语句时,MySQL报错;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SIGNAL SQLSTATE 'HY000' SET message_text = msg;

如果该SIGNAL语句指示特定SQLSTATE值,则该值用于表示指定的条件

“HY000”被称为“一般错误”:

如果命令出现一般错误,则会触发后面的message中的消息;

注:该语句只是个人理解,也是一知半解,如果有更好的解释,欢迎留言。

触发的条件以BEGIN开始,END结束。

触发事件:

  1. insert
  2. update
  3. delete

删除触发器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 删除触发器
DROP TRIGGER newproduct;

INSERT触发器:

insert触发器在insert语句执行之前或者之后执行,需要注意以下几点:

  1. 在insert触发器代码内。可以引用一个名为NEW的虚拟表,访问被插入的行;
  2. 在before insert触发器中,NEW中的值也可以被更新(允许更改被插入的值)
  3. 对于AUTO_INCREMENT列,NEW在insert执行之前包含0,在insert执行之后包含新的自动生成值

例子:插入一个新的订单时,生成一个新的订单号保存到order_num

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TRIGGER neworder AFTER INSERT ON orders for EACH ROW
 SELECT NEW.order_num into @ee;

insert INTO orders(order_date,cust_id) VALUES(NOW(),10001);
SELECT @ee as num;

drop TRIGGER neworder;

解释:

创建一个neworder的触发器,在插入之后执行,且对每个插入行执行,在insert中有一个与orders表一摸一样的虚表,用NEW 表示;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT NEW.order_num into @a;

在虚表中找到我们插入的数据的编号,将标号保存在a变量中;

检测:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
insert INTO orders(order_date,cust_id) VALUES(NOW(),10001);
SELECT @ee as num;

插入数据,输出插入数据的编号

删除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
drop TRIGGER neworder;

删除触发器。

例二:

在COURSE表上创建触发器,检查插入时是否出现课程名相同的记录,若有则不操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TRIGGER trg_course_in 
BEFORE INSERT ON course
FOR EACH ROW
BEGIN
        DECLARE msg VARCHAR(100);  
        IF EXISTS (SELECT * FROM  course where cname=NEW.cname)   THEN 
            SET msg='不能输入相同名称的课程'; 
            SIGNAL SQLSTATE 'HY000' SET message_text = msg; 
        END IF; 
    
END

例三:向student表中插入信息时,检查ssex的值必须为男或女。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TRIGGER trg_ssex AFTER INSERT on student FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100);
 IF(NEW.ssex not in('男','女')) THEN
 	SET msg ='性别必须为男或女'; 
 	SIGNAL SQLSTATE 'HY000' SET message_text = msg;
 END IF
END

UPDATE触发器:

  1. 在update触发器的代码中,可以引用一个名为OLD的虚拟表访问以前的值,即:update未执行前的值,还可以引用一个名为NEW的虚拟表访问新更新的值;
  2. 在before update触发器中,NEW中的值可能也被更新(允许修改将要用于update语句中的值);
  3. OLD中的值全部只读,不能更新。

例一:保证州名缩写为大写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TRIGGER UPDATEevendor BEFORE UPDATE on vendors
FOR EACH ROW SET new.vend_state =UPPER(new.vend_state);

UPDATE vendors SET vend_state='hw' where vend_id='1001';
DROP TRIGGER UPDATEevendor;

注:upper:将文本转换为大写:

例二:不允许修改student表中的学号sno,如果修改该列则显示错误信息并取消操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TRIGGER trg_student_updateSno BEFORE UPDATE
FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100);  
 IF NEW.sno <> OLD.sno THEN 
 	SET msg='不允许修改sno'; 
    SIGNAL SQLSTATE 'HY000' SET message_text = msg;  
 END IF; 
END

DELETE触发器:

在DELETE触发器在delete语句执行之前或之后执行:

  1. 在delete触发器代码内,可以引用OLD的虚拟表,访问被删除的行;
  2. OLD中的值全部都是只读,不能更新

例子:

使用old保存将要被删除的行到一个存档表中

首先先创建一个与orders相似的表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE archive_orders LIKE orders;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 创建一个删除的触发器
CREATE TRIGGER deleteorder BEFORE DELETE on orders
for EACH ROW BEGIN
INSERT INTO archive_orders(order_num,order_date,cust_id) VALUES(old.order_num,old.order_date,old.cust_id);
END

解释:

在删除order表中行中信息时,将删除的信息保存到archive_orders中;

删除原表中一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DELETE FROM orders WHERE order_num='20014';

查看效果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT * FROM archive_orders;

结束:

注:如果遇到触发器报错“Not allowed to return a result set from a trigger”

  1. 原因:因为从MySQL5以后不支持触发器返回结果集
  2. 解决方法:在后面语句后面添加 into @变量名
  3. 取数据:select @变量名

详细解释:https://www.programmersought.com/article/3237975256/

创建用户变量:https://blog.csdn.net/JesseYoung/article/details/40779631

相关内容持续更新,请关注:https://www.cnblogs.com/xbhog/ 感谢各位看到最后!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/12/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL触发器介绍
在学习 MySQL 的过程中,可能你了解过触发器的概念,不清楚各位是否有详细的去学习过触发器,最近看了几篇关于触发器的文档,分享下 MySQL 触发器相关知识。
MySQL技术
2021/08/24
4.3K0
MySQL视图,存储过程和触发器的使用
在视图创建后,可以用表的基本操作来使用视图,进行SELECT,WHERE,ORDER BY,联结等操作。视图仅仅是用来查看存储在别处的数据的一种工具而不是一个表,本身存储数据。
小末快跑
2019/07/03
1.3K0
MySql基础之触发器
2、创建触发器:创建名称为before_insert的触发器,向test_trigger数据表插入数据之前,向 test_trigger_log数据表中插入before_insert的日志信息。
Java微观世界
2025/01/21
2630
MY SQL存储过程、游标、触发器--Java学习网
大多数SQL语句都是针对一个或多个表的单条语句。并非所有的操作都怎么简单。经常会有一个完整的操作需要多条才能完成
用户1289394
2021/05/31
2.1K0
mysql随笔
用户1141560
2017/12/26
8690
MySQL触发器
在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分 别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时 在库存表中添加一条库存记录。 这样一来,我们就必须把这两个关联的操作步骤写到程序里面,而且要用 事务 包裹起来,确保这两个操 作成为一个 原子操作 ,要么全部执行,要么全部不执行。
一个风轻云淡
2022/11/13
4.1K0
MySQL触发器
MySQL必知必会总结
数据的所有存储、检索、管理和处理实际上是由数据库软件——DBMS(数据库管理系统)完成的。MySQL是一种DBMS,即它是一种数据库软件。MySQL是一种DBMS,即它是一种数据库软件。特点如下:
用户3578099
2023/09/01
5760
MySQL必知必会总结
第17章_触发器
在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的完整性,必须同时在库存表中添加一条库存记录。
程序员Leo
2023/08/07
4020
第17章_触发器
MySQL触发器示例
该触发器名为“assign_id”,关联的表为“my_table”,在每次插入新行时自动执行。在触发器中,我们使用一个子查询来确定当前表中最大的ID值,并将其加1,以便将新的ID分配给插入的行。
堕落飞鸟
2023/05/11
3K0
MySQL触发器详解
它是一种特殊的一种存储过程,当表数据发生了新增、更新、删除时,便触发这个存储过程。
半月无霜
2023/03/03
6.9K0
MySQL触发器详解
Mysql 快速指南
Mysql 本文的示例在 Mysql 5.7 下都可以测试通过。 概念 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)。 数据表(table):某种特定类型数据的结构化清单。 模式(schema):关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储,包含存储什么样的数据,数据如何分解,各部分信息如何命名等信息。数据库和表都有模式。 列(column):表中的一个字段。所有表都是由一个或多个列组成的。 行(row):表中的一个记录。 SQL 基础 SQL(S
静默虚空
2018/05/28
7.5K0
sql server 实验5.2 触发器的建立与使用
一、实验目的                                                     
week
2018/08/27
2.3K0
mysql 存储过程返回更新前记录
在数据库管理中,有时候我们需要在执行更新操作后,能够获取到更新前的数据记录,以便进行数据对比或者回滚操作。MySQL的存储过程可以帮助我们实现这一需求。本文将深入浅出地讲解如何通过MySQL存储过程获取更新前的记录,并提供具体的代码示例。
Jimaks
2024/05/27
6900
MySQL 从入门到实践,万字详解!
数据库是往全栈发展不得不跨过的一道坎,大家不可避免会学到用到相关知识,最近查资料的时候发现网上很多内容要么就特别深,要么不成体系,对一些希望浅尝辄止仅仅是使用一下的人不太友好。最近刚好有机会学到 MySQL,集中一些时间学习了一下 MySQL 同时做了一些笔记,每个概念基本都有代码示例,每一行都是在下手打,读者可以直接复制了代码到命令行中运行,希望对大家有所帮助~ 😜 本文介绍的知识都不是特别深,目标用户是对 MySQL 零基础或弱基础的小伙伴们,可以帮助对 MySQL 建立一些概念,至少碰到相关问题知道
前端下午茶
2022/03/22
2.3K0
MySQL 从入门到实践,万字详解!
SQL 语法速成手册
本文针对关系型数据库的一般语法。限于篇幅,本文侧重说明用法,不会展开讲解特性、原理。
JAVA葵花宝典
2020/07/09
18K0
SQL 语法速成手册
mysql 触发器介绍
触发器(Trigger)是 MySQL 中非常实用的一个功能,它可以在操作者对表进行「增删改」 之前(或之后)被触发,自动执行一段事先写好的 SQL 代码。
用户1217611
2022/05/06
5.8K0
mysql 触发器介绍
mysql--触发器复习
触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的,即不是主动调用而执行的;而存储过程则需要主动调用其名字执行
大忽悠爱学习
2021/11/15
2.6K0
MySQL从删库到跑路_高级(五)——触发器
触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。
良月柒
2019/03/20
1.6K0
MySQL从删库到跑路_高级(五)——触发器
MySQL(十一)之触发器
上一篇介绍的是比较简单的视图,其实用起来是相对比较简单的,以后有什么更多的关于视图的用法,到时候在自己补充。接下来让我们一起了解一下触发器的使用! 一、触发器概述 1.1、什么是触发器   触发器(Trigger):监视某种情况,并触发某种操作。在MySQL Server里面也就是对某一个表的一定的操作,触发某种条件(Insert,Update,Delete 等),从而自动执行的一段程序。   注意:你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够
用户1195962
2018/01/18
2.1K0
MySQL命令,一篇文章替你全部搞定
MySQL的基本操作可以包括两个方面:MySQL常用语句如高频率使用的增删改查(CRUD)语句和MySQL高级功能,如存储过程,触发器,事务处理等。而这两个方面又可以细分如下:
Java天坑
2018/09/29
3K0
MySQL命令,一篇文章替你全部搞定
相关推荐
MySQL触发器介绍
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验