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

 更新时间:2022年06月23日 11:34:02   作者:ISPEAKER  
MySQL 的触发器和存储过程一样,都是嵌入到 MySQL 中的一段程序,是 MySQL 中管理数据的有力工具,本文给大家详细介绍mysql触发器的定义语法知识,感兴趣的朋友一起看看吧

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的值。

  具体实例:

#创建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触发器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql 登录时闪退的问题解决方法

    mysql 登录时闪退的问题解决方法

    这篇文章主要介绍了mysql 登录时闪退的问题解决方法的相关资料,mysql 出现闪退问题,很是棘手在做项目的时候,这里对解决这样的问题提供了解决方案,需要的朋友可以参考下
    2016-11-11
  • MYSQL导入导出命令详解

    MYSQL导入导出命令详解

    网上看了一些总结出来的资料,不知道对大家有没有用的,有用的话也就不枉费我一按按钮的一片苦心了
    2007-09-09
  • 两种mysql对自增id重新从1排序的方法

    两种mysql对自增id重新从1排序的方法

    本文介绍了两种mysql对自增id重新从1排序的方法,简少了对于某个项目初始化数据的工作量,感兴趣的朋友可以参考下
    2015-07-07
  • 解决 phpmyadmin #2002 无法登录 MySQL 服务器

    解决 phpmyadmin #2002 无法登录 MySQL 服务器

    我以前使用phpmyadmin都是很正常的,从来没有出现过问题。但是今天出现了提示#2002无法登陆到MYSQL服务器
    2012-04-04
  • Mysql聚合函数的使用介绍

    Mysql聚合函数的使用介绍

    今天的章节我们将要来学习一下 “聚合函数” ;首先我们需要学习聚合函数对数据进行统计分析,比如说求最大值、最小值、平均值之类的场景。但是单纯的使用聚合函数,只能做全表范围的统计分析
    2022-10-10
  • 浅谈MySQL 亿级数据分页的优化

    浅谈MySQL 亿级数据分页的优化

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。本文就来介绍一下MySQL 亿级数据分页的优化,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • MYSQL关联关系查询方式

    MYSQL关联关系查询方式

    文章详细介绍了MySQL中如何使用内连接和左外连接进行表的关联查询,并展示了如何选择列和使用别名,文章还提供了一些关于查询优化的建议,并鼓励读者参考和支持脚本之家
    2025-02-02
  • Mysql从5.6.14安全升级至mysql5.6.25的方法

    Mysql从5.6.14安全升级至mysql5.6.25的方法

    这篇文章主要介绍了Mysql从5.6.14安全升级至mysql5.6.25的方法,本教程讲的非常详细,具有参考借鉴价值,需要的朋友参考下吧
    2016-08-08
  • 解决ERROR 1129 (HY000): Host ‘xxx‘ is blocked because of many问题

    解决ERROR 1129 (HY000): Host ‘xxx‘ is blocked because 

    这篇文章主要介绍了解决ERROR 1129 (HY000): Host ‘xxx‘ is blocked because of many问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Mysql存储过程学习笔记--建立简单的存储过程

    Mysql存储过程学习笔记--建立简单的存储过程

    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
    2014-08-08

最新评论