当前位置: 首页 > article >正文

SQL语法——触发器

MySQL触发器简介

在MySQL中,触发器是一组SQL语句,当对关联表上的数据进行更改时会自动调用这些语句。可以定义触发器在INSERT,UPDATE或DELETE语句更改数据之前或之后调用。在MySQL 5.7.2版之前,可以为每个表定义最多六个触发器。

  1. BEFORE INSERT - 在将数据插入表格之前激活。
  2. AFTER INSERT - 将数据插入表格后激活。
  3. BEFORE UPDATE - 在更新表中的数据之前激活。
  4. AFTER UPDATE - 更新表中的数据后激活。
  5. BEFORE DELETE - 在从表中删除数据之前激活。
  6. AFTER DELETE - 从表中删除数据后激活。

但是,从MySQL版本5.7.2+开始,可以为同一触发事件和操作时间定义多个触发器。

当使用不包含INSERT,DELETE或UPDATE语句来修改表中的数据,与表关联的触发器不被调用。例如,TRUNCATE语句删除表的所有数据,但不调用与表关联的触发器。

有一些语句使用INSERT其它语句,如REPLACE语句 或 LOAD DATA语句。如果使用这些语句,则会调用与表关联的相应触发器。

必须为与表关联的每个触发器使用唯一名称。但是可以为不同的表定义相同的触发器名称。

命名规则:

(BEFORE | AFTER)_tableName_(INSERT| UPDATE | DELETE) -- 或tablename_(BEFORE | AFTER)_(INSERT| UPDATE | DELETE) 
MySQL触发存储

MySQL将触发器存储在数据目录中,例如,/data/mysqldemo/使用名为的文件tablename.TRG和 triggername.TRN:

  1. tablename.TRG文件将触发器映射到相应的表。
  2. triggername.TRN文件包含触发器定义。
MySQL触发器限制

MySQL触发器不能:

  1. 使用SHOW,LOAD DATA,LOAD TABLE,BACKUP DATABASE,RESTORE,FLUSH和RETURN语句。
  2. 使用隐式或显式提交或回滚的语句,例如COMMIT,ROLLBACK,START TRANSACTION,LOCK / UNLOCK TABLES,ALTER,CREATE,DROP, RENAME。
  3. 使用 准备语句 PREPARE和EXECUTE之类的
  4. 使用动态SQL语句。

从MySQL版本5.1.4开始,触发器可以调用存储过程或存储函数,这是以前版本的限制

MySQL触发语法
CREATE TRIGGER trigger_name trigger_time trigger_eventON table_nameFOR EACH ROWBEGIN...END; 
  1. 在CREATE TRIGGER语句后面添加了触发器名称。触发器名称应遵循的命名约定[trigger time][table name][trigger event],例如before_employees_update。
  2. 触发激活时间可以是BEFORE或AFTER。您必须在定义触发器时指定激活时间。使用BEFORE对表进行更改之前处理操作,然而需要在更改后处理操作,则使用 AFTER关键字。
  3. 触发事件可以是INSERT,UPDATE或者DELETE事件导致触发器被调用。只有一个事件可以调用触发器。要定义由多个事件调用的触发器,您必须定义多个触发器,每个事件对应一个触发器。
  4. 触发器必须与特定表关联。如果没有表触发器将不存在,因此您必须在ON关键字后指定表名。
  5. 将SQL语句放在BEGIN和END阻止之间。您可以在此定义触发器的逻辑。
MySQL触发器示例

首先,创建一个表名为 employees_audit保持更改employee表。以下语句创建employee_audit表。

CREATE TABLE employees_audit (id INT AUTO_INCREMENT PRIMARY KEY,employeeNumber INT NOT NULL,lastname VARCHAR(50) NOT NULL,changedat DATETIME DEFAULT NULL,action VARCHAR(50) DEFAULT NULL
); 

接下来,创建BEFORE UPDATE在对employees表进行更改之前调用的触发器。

DELIMITER $$
CREATE TRIGGER before_employee_update BEFORE UPDATE ON employees FOR EACH ROW
BEGININSERT INTO employees_audit SET action = 'update',employeeNumber = OLD.employeeNumber,lastname = OLD.lastname,changedat = NOW( );
END $$
DELIMITER ; 

然后,要查看当前数据库中的所有触发器,请使用SHOW TRIGGERS如下语句:

SHOW TRIGGERS; 

之后,更新employees表以检查是否调用了触发器。

UPDATE employees 
SET lastName = 'Phan'
WHEREemployeeNumber = 1056; 

最后,要检查UPDATE语句是否调用了触发器,可以employees_audit使用以下查询查询表:

SELECT *
FROMemployees_audit; 

在这里插入图片描述

MySQL 创建多个触发器

在MySQL 5.7.2版之前,只能为表中的事件创建一个触发器,例如,您只能为BEFORE UPDATE或AFTER UPDATE事件创建一个触发器。MySQL 5.7.2+解除了这一限制,允许您为表中的相同事件和操作时间创建多个触发器。事件发生时,触发器将按顺序激活。

创建第一个触发器的语法保持不变。如果在表中有相同事件的多个触发器,MySQL将按创建顺序调用触发器。要更改触发器的顺序,需要指定FOLLOWS或PRECEDES在FOR EACH ROW子句之后。

  1. FOLLOWS 选项允许在现有触发器之后激活新触发器。
  2. PRECEDES 选项允许在现有触发器之前激活新触发器。

以下是使用显式顺序创建新的附加触发器的语法:

DELIMITER $$
CREATE TRIGGER  trigger_name
[BEFORE|AFTER] [INSERT|UPDATE|DELETE] ON table_name
FOR EACH ROW [FOLLOWS|PRECEDES] existing_trigger_name
BEGINEND$$
DELIMITER ; 
http://www.lryc.cn/news/2419503.html

相关文章:

  • 卷!推荐11个做PPT的神仙网站
  • xshell安装错误:-1605这个操作只对当前安装的产品有效
  • 系统架构图
  • Python 三个拆分函数(split、rsplit、splitlines)不同的用法
  • PUBG介绍
  • 网页星号密码查看器_四大密码查看器 星号、浏览器保存密码、连接过的WIFI账号密码...
  • Java中慎用e.printStackTrace()
  • 2022年诺贝尔物理学奖背后的故事——贝尔不等式诞生之后
  • SurfaceView 基本使用
  • 硬件测试需要什么软件是什么原因,什么硬件软件检测温度准啊
  • zeros什么意思_什么是张量?
  • Ubuntu Touch的小确幸(Linux系统手机Ubports)
  • 数据结构(C语言版)--速成笔记【持续更新中。。】
  • MPEG-4视频压缩基础
  • 【FISCO-BCOS】 一、默认配置搭建区块链网络
  • textmate开发一个blog
  • 8个简单有用windows命令,电脑小白的高级命令!
  • MultiByteToWideCharWideCharToMultiByte 函数介绍
  • 机器学习——多项式拟合
  • java6下载安装_windows下如何安装java6.0
  • 使用C#的DrawString方法绘制文本
  • 建筑抗震设计规范
  • java入门基础教程(纯干货知识点+视频资源)
  • CC2530 zigbee模块概述与环境搭建
  • petri网基本概念
  • 【自动控制理论】 相位裕度和增益裕度
  • 数据库,万能密码与密码解析
  • android 通过广播唤醒被杀死的app
  • 工具之《activemq管理界面介绍》
  • 手把手教你用Python爬虫入门