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)

大家都在看

  • Linux 守护进程

    1. 守护进程是什么 2. 怎么用守护进程 2.1 有趣小例子 2.2 man daemon 3. 源码解析 3.1 GUN C daemon.c 3.2 daemon.c 解析 …

    数据库 2023年6月9日
    093
  • Git (简单基本操作)

    1、设置配置信息 查看配置信息:git config -l 设置用户名:git config –global user.name xxx 设置邮箱:git config…

    数据库 2023年6月16日
    0102
  • MYSQL–>视图

    视图就是一种 虚拟存在的表。因为视图的数据不在数据库中实际存在。 视图的行和列的数据都来自于 我们定义视图所使用的表 其中,定义视图所使用的表叫 基表 视图的行和列的数据是在使用视…

    数据库 2023年6月14日
    090
  • MySQL排序方案选择

    总结一下,MySQL 总是使用 “最快” 的排序方案。 总结 总结一下,MySQL 总是使用 “最快” 的排序方案: 1、当排序数据…

    数据库 2023年6月9日
    0126
  • ORA-01950: no privileges on tablespace ‘USERS’– 解决办法

    ORA-01950: no privileges on tablespace ‘USERS’ 原因: 在表空间 “USERS” 无权…

    数据库 2023年6月14日
    0128
  • 在浏览器中Django项目的静态文件打不开的一个原因

    2022-09-27 问题描述: 编写Django代码时,设置了一个”static”文件夹,在里面放置了一张图片。在”setting&#8221…

    数据库 2023年6月14日
    0120
  • Ceph创建一个新集群 报错: File “/usr/bin/ceph-deploy”, line 18, in……….

    [root@ceph-node1 ceph]# ceph-deploy new node1 Traceback (most recent call last): File &quo…

    数据库 2023年6月14日
    099
  • 关于看源码的心得体会

    前段时间面试,经常遇到面试官在结束的时候问我看过什么开源源码?然后网上对于看源码这块的说法也有各种不同的意见,我进行了总结如下: 不看源码说法: 平常的工作需求、业务忙的一批,哪有…

    数据库 2023年6月6日
    0283
  • MySQL安装配置

    一.下载安装 二.配置 一.下载安装 地址: 官方地址(可能速度不好):https://dev.mysql.com/downloads/mysql/ 网盘直链地址(速度比较快):h…

    数据库 2023年5月24日
    0110
  • 18-网络七层架构

    七层架构主要包括 ①、 物理层 主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由 1、0 转化为电流强弱来进行传输…

    数据库 2023年6月16日
    0103
  • 三种云计算服务模式XaaS简单随笔

    SaaS的云计算服务随笔 马上队伍要组为解决方案团队了,得先理一理咱所处的解决方案SaaS团队的建设目标,其实就是给用户提供集成的软件解决方案,对物联网设备上云数据可视化管理等。 …

    数据库 2023年6月6日
    091
  • Mysql数据库体系

    Mysql数据库体系如下(手绘): 描述: 1.DBMS:database system management是数据库管理软件,平时我们使用的数据库的全称,是C/S架构(clien…

    数据库 2023年6月6日
    0106
  • 阿里巴巴编码规范-考试认证

    阿里巴巴编码规范-考试认证 雨打梨花深闭门,忘了青春,误了青春。 1、注册阿里云账号 2、购买认证 需要怒支付一顿早餐Q,可以用支付宝支付,选择支付宝支付然后直接输入支付密码就OK…

    数据库 2023年6月14日
    0186
  • 关于互联网通信流程–架构–资源文件等

    互联网通信流程: 客户端 ——–服务端 互联网通&amp…

    数据库 2023年6月11日
    0109
  • 分享攒了多年的mssql脚本

    分享攒了多年的mssql脚本 脚本类别包括:备份还原表分区常用函数错误日志定时自动抓取耗时SQL并归档发邮件脚本模块镜像批量脚本数据库收缩数据库损坏数据库账号统计数据库大小性能作业…

    数据库 2023年6月9日
    0110
  • Java面向对象程序设计(2)封装,继承和多态

    面向对象的三大特征是:封装,继承和多态 访问修饰符 java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围) : 访问级别 访问控制修饰符 同类 同包 …

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