Mysql中的触发器定义及语法介绍


Posted in MySQL onJune 25, 2022

1.定义:

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

  • 在MySQL中,目前只有UPDATE,INSERT,和DELETE这三种操作,才会触发触发器,其他操作都不支持触发器。这和Oracle中的触发器有很大的区别,要注意区分。
  • 触发器的每个表每次事件,都只允许一个触发器。因此,每个表最多值允许有6个触发器。如果一个表有两个事件,INSERT和DELETE,那么就要分别创建一个触发器。
  • 只有表才支持触发器,视图和临时表不支持。

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;

#触发触发器T2
UPDATE customer SET CUST_ID = '10000' WHERE CUST_NAME = 'AAA';

#查询OLD和NEW
SELECT @OLD_ID,@NEW_ID;

到此这篇关于Mysql中的触发器的文章就介绍到这了,更多相关mysql触发器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
MySQL Innodb关键特性之插入缓冲(insert buffer)
Apr 08 MySQL
mysql的MVCC多版本并发控制的实现
Apr 14 MySQL
详解MySQL主从复制及读写分离
May 07 MySQL
MySQL sql_mode的使用详解
May 08 MySQL
为什么mysql字段要使用NOT NULL
May 13 MySQL
SQL注入的实现以及防范示例详解
Jun 02 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
MySQL中B树索引和B+树索引的区别详解
Mar 03 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
了解MySQL查询语句执行过程(5大组件)
Aug 14 MySQL
MySQL数据库配置信息查看与修改方法详解
Jun 25 #MySQL
SQL语句中EXISTS的详细用法大全
Jun 25 #MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 #MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 #MySQL
MySQL数据库表约束讲解
Jun 21 #MySQL
MySQL数据库实验之 触发器和存储过程
Jun 21 #MySQL
MySQL transaction事务安全示例讲解
Jun 21 #MySQL
You might like
深入理解PHP原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
PHP抽象类 介绍
2012/06/13 PHP
如何设置mysql允许外网访问
2013/06/04 PHP
PHP字符串长度计算 - strlen()函数使用介绍
2013/10/15 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
使用不同的方法结合/合并两个JS数组
2014/09/18 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
BootStrap Select清除选中的状态恢复默认状态
2017/06/20 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
Vuex 模块化使用详解
2019/07/31 Javascript
layui 根据后台数据动态创建下拉框并同时默认选中的实例
2019/09/02 Javascript
ES6 Object.assign()的用法及其使用
2020/01/18 Javascript
Python开发之Nginx+uWSGI+virtualenv多项目部署教程
2019/05/13 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
python调用win32接口进行截图的示例
2020/11/11 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
元旦联欢会主持词
2014/03/26 职场文书
干部对照检查材料范文
2014/08/26 职场文书
委托公证书样本
2015/01/23 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
分享几个简单MySQL优化小妙招
2022/03/31 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
2022/04/19 MySQL
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技