MySQL中的触发器

1.定义:

触发器和存储过程相似,都是嵌入到 MySQL 中的一段程序。触发器是由事件来触发某个操作。当数据库执行这些事件时,就会激活触发器来执行相应的操作。这些事件称为触发条件,在MySQL中,有UPDATE,INSERT,和DELETE。

  • 在MySQL中,目前只有UPDATE,INSERT,和DELETE这三种操作,才会触发触发器,其他操作都不支持触发器。这和Oracle中的触发器有很大的区别,要注意区分。
  • 在MySQL5.7.2版本之前,触发器的每个表每次事件,都只允许一个触发器。因此,每个表最多值允许有6个触发器。如果一个表有两个事件,INSERT和DELETE,那么就要分别创建一个触发器。从MySQL版本5.7.2+开始,可以为同一触发事件和操作时间定义多个触发器。
  • 只有表才支持触发器,视图和临时表不支持。

2.语法:

CREATE TRIGGER TRIGGER_NAME
BEFORE/AFTER
UPDATE/INSERT/DELETE ON TABLE_NAME
FOR EACH ROW
#触发器主体
[BEGIN]
SQL操作
[END];
  • 创建触发器:和创建存储过程是一样,用的都是CREATE 语句,但要注意,这里没有 OR REPLACE。
  • TRIGGER_NAME:触发器名称。在MySQL中,要保证每个表中的触发器是唯一的,每一个数据库内的触发器可以不唯一,这就说明了一个数据库内的两个表可以有相同的触发器。这种行为在其他的数据库内是不被允许的。但是为了格式上的规范,还是要尽可能的保证TRIGGER_NAME的唯一性。
  • BEFORE/AFTER:触发器被触发的时刻。你如果希望触发器在触发事件之前发生,就使用BEFORE,如果希望在触发事件之后发生,就使用AFTER。
  • UPDATE/INSERT/DELETE:触发事件,触发条件。在MySQL中,只有这三种DDL操作支持触发器,其他操作都不被允许。
  • FOR EACH ROW:受触发事件影响的每一行都要激活触发器的动作。这里指的是行级触发,在MySQL里,FOE EACH ROW不可省略,不支持语句级触发。
  • 触发器主体:既可以是单独的一条SQL语句,也可以是由BEGIN…END组成的复杂结构块。
创建一个触发器T1,在对表customer做插入操作时,就会触发T1,之后会在日志表note中插入一条数据
CREATE TRIGGER T1
AFTER
INSERT ON customer
FOR EACH ROW # 触发器主体
INSERT INTO note(日期,目标,操作) VALUES(NOW(),'customer','insert');

3.删除触发器

和删除表和存储过程类似,都是使用DROP语句来删除触发器。

#删除触发器T1
DROP TRIGGER IF EXISTS T1;
  • 触发器不能够更新和修改,想要修改一个触发器的内容,只能先将触发器删除,在创建一个新的触发器。

4.查询触发器

#在已知数据库内,查询触发器SHOW TRIGGERS;SELECT * FROM information_schema.TRIGGERS WHERE TRIGGER_NAME = '触发器名'
#查询所有的触发器
SELECT * FROM information_schema.TRIGGERS(WHERE TRIGGER_SCHEMA = '数据库名')

5.触发器类型OLD和NEW的使用

触发器在DDL操作之前或者之后触发,总会对目标表做出一定的改动,有时我们需要知道目标表改变前后的值,这就用到了OLD和NEW的用法。

顾名思义,OLD就是改变之前的值,是UPDATE之前或者是要被DELETE或者已经被DELETE的值。

而NEW,则是UPDATE之后的新值,即将INSERT或者已经INSERT的值。

MySQL中的触发器

具体实例:

#创建customer表
CREATE TABLE customer
(CUST_ID int(11) NOT NULL AUTO_INCREMENT,
CUST_NAME varchar(10) NOT NULL,
CUST_TEL varchar(10) DEFAULT NULL,
PRIMARY KEY (CUST_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
#向表中插入数据
#创建一个update触发器
CREATE TRIGGER T2
AFTER
UPDATE ON customer
FOR EACH ROW
#old和new的使用方法:old.columnname/new.columnname(列名)
#将更新前后的值,赋值给两个变量
SELECT OLD.CUST_ID,NEW.CUST_ID INTO @OLD_ID,@NEW_ID;#触发触发器T2UPDATE customer SET CUST_ID = '10000' WHERE CUST_NAME = 'AAA';#查询OLD和NEWSELECT @OLD_ID,@NEW_ID;

6.触发器的限制

MySQL触发器覆盖标准SQL定义中的所有功能,但在应用程序使用中,它们也存在一些限制:

  • 单一的触发器不可以与多个表或者多个事件相关联,如果想要对一个表进行多个触发操作,可以多创建几个触发器。
  • MySQL触发器中不能使用SHOW,LOAD TABLE,LOAD DATA,BACKUP DATABASE, RESTOREFLUSH,RETURN语句。
  • 不能使用隐式或显式提交或回滚的语句,例如COMMIT,ROLLBACK,START TRANSACTION, LOCK / UNLOCK TABLES,ALTER,CREATE,DROP,RENAME。
  • 不能使用PREPARE和EXECUTE之类的准备语句。
  • 不能出现动态SQL。

Original: https://www.cnblogs.com/zhouyang-123/p/16401126.html
Author: ISPEAKER
Title: MySQL中的触发器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621130/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 量子物理

    今天刷了YouTube的量子物理了解到了量子物理的发展史从微观到相对论从原子核到量子纠缠何其快哉 物理学:经典物理,量子物理。经典物理:万有引力量子物理:相对论 Original:…

    数据库 2023年6月11日
    076
  • asyncio 异步编程

    首先了解一下协程,协程的本质就是一条线程,多个任务在一条线程上来回切换,协程的所有切换都是基于用户,只有在用户级别才能感知到的 IO 才会用协程模块来规避,在 python 中主要…

    数据库 2023年6月9日
    059
  • 运行jar包使用外部依赖

    nohup java -Dloader.path=”lib/” -Dfile.encoding=utf-8 -jar test.jar > test….

    数据库 2023年6月9日
    056
  • EXCLE中SUMIF和SUMIFS的用法

    一、函数的含义 1、SUMIF函数在EXCLE中是用来对指定条件对若干单元格求和; 2、SUMIFIS函数在EXCLE中是用来对一个区域内满足多重条件的单元格求和(两个条件以上);…

    数据库 2023年6月11日
    082
  • 《Redis设计与实现》

    由浅到深,逐步讲解Redis 本书主要分为四大部分。 第一部分”数据结构与对象”: 介绍了Redis中的各种对象及其数据结构,并说明这些数据结构如何影响对象…

    数据库 2023年6月6日
    088
  • java面试题(2022最新)

    JDK 和 JRE 有什么区别?JRE:Java Runtime Environment(java运行时环境)。即java程序的运行时环境,包含了java虚拟机,java基础类库。…

    数据库 2023年6月16日
    085
  • 自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器

    特别注意:本代码为 Springboot 工作流 前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.3.0+ Flowable6.5.0+ my…

    数据库 2023年6月6日
    0115
  • 摸鱼系列之idea摸鱼插件推荐

    前言 作为一枚程序员,上班时候正撸着代码呢,撸不出代码了,没灵感了,看需求念头不通达了,脑瓜里蹦不出一丁点火花了,这时候怎么办?程序在运行,还要好几分钟,等待时间里,白白浪费了,玩…

    数据库 2023年6月16日
    0122
  • Redis

    一、了解 1、Nosql概述(同sql的区别) 1、存储方式 SQL&…

    数据库 2023年6月6日
    079
  • 自动化测试练手项目推荐

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/80599ac8.html 你好,我是测试蔡坨坨。 最近收到许多自学自动化测试的小伙伴私信,学习了理论知…

    数据库 2023年6月11日
    0108
  • 绘制几何图形

    《零基础学Java》 绘制几何图形Java可以 分别使用 Graphics 和 Graphics2D 绘制图形, Graphics类 使用不同的方法绘制不同的图形(drawLine…

    数据库 2023年6月16日
    096
  • mysql-事务

    1.事务(transaction)事务是业务逻辑的基本单元。 [En] A transaction is a basic unit of business logic.每一个事务由…

    数据库 2023年5月24日
    078
  • InnoDB 中不同SQL语句设置的锁

    锁定读、UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁。语句中是否存在排除该行的WHERE条件并不重要。InnoDB不记得确切的WHE…

    数据库 2023年5月24日
    074
  • 最左前缀有手就会,那索引下推呢?

    联合指数的最左侧前缀原则属于高频面试题,大多数学生都必须知道,但不符合最左侧前缀的部分会发生什么(指数向下推) [En] The leftmost prefix principle…

    数据库 2023年5月24日
    077
  • 处理mysql主从不同步问题

    问题描述:发现主库操作数据从库没有变动问题,可能原因是从库重启导致的无法同步问题。 排查思路: 1、查看主从复制状态 发现从库的IO 和SQL 进程都是no(正常状态应该是yes)…

    数据库 2023年5月24日
    075
  • MySQL 回表

    MySQL 回表 五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。 一、简述 回表,顾名思义就是回到表中,也就是先通过普通索引扫描出数据所在的行,再通过行主键ID 取出索引中未包含…

    数据库 2023年5月24日
    082
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球