一、触发器简介

  当需要某些操作在某些语句执行之前或之后执行就需要使用触发器。

  例如每次插入数据时进行数据校对,每次删除数据后将删除内容备份到新表。

  这些操作我们希望它(某些语句)在满足某些条件时自动执行,也可以称为这些条件触发了这些操作。

  

  既然某些操作可以触发某些操作,那么关键要定义两点:

  1.触发条件。

  2.触发后执行的操作。

  

  MySQL中触发器只对INSERT、DELETE、UPDATE语句有效,即执行这些语句可以触发设置的触发器。

  触发器根据触发的时间可分为BEFORE、AFTER,一种是在被执行语句执行前触发,一种是在被执行语句执行后触发。

  创建触发器需要定义触发器名(最好当前数据库唯一)、触发器关联的表、触发语句(INSERT|DELETE|UPDATE)、

  触发时机(BEFORE|AFTER)。

CREATE TRIGGER newProduct02 AFTER INSERT ON products
FOR EACH ROW SELECT 'add info' INTO @info;
-- INSERT INTO products(...) VALUES(...);
-- SELECT @info;

创建了一个名为newProduct02的触发器,该触发器在执行INSERT语句之后执行。

FOR EACH ROW代表行级触发,表示任何一条记录上的操作满足触发事件都会触发该触发器,

也就是说触发器的触发频率是针对每一行数据触发一次。

SELECT ‘add info’ INTO @info 代表触发器执行的操作,将‘add info’ 设置给变量info(用户变量采用@开头),

当向products表执行INSERT语句后,会执行触发器将值设置给@info.

通过SELECT @info;可显示变量值。

注:一个表中

二、删除触发器

  DROP TRIGGER 触发器名。

三、使用触发器

  3.1 INSERT触发器

  INSERT触发器的触发时机可以是BEFORE、AFTER。

  在INSERT触发器内可以引用一个名为NEW的虚拟表。

  该虚拟表表示将要插入(BEFORE)或已经插入(AFTER)的数据。

  在BEFORE中代表将要插入的数据

  在AFTER中代表插入后的数据,

  

  INSERT INTO tableName(id,name) VALUES('1', 'hcf'):可以看做:

  NEW.id = '1', NEW.name = 'hcf';

  BEFORE INSERT TRIGGER...(此时NEW代表将要插入的数据,如果此时对NEW.id的值进行修改,最后插入的值也会被修改)

  INSERT INTO tableName(id,name) VALUES(NEW.id, NEW.name);

  AFTER INSERT TRIGGER...(此时NEW.id代表插入后的数据。插入完成后不可对NEW进行修改)

  下面看一个例子理解。

  

CREATE TRIGGER newProduct03 AFTER INSERT ON products
FOR EACH ROW SELECT NEW.prod_id INTO @info;
-- INSERT INTO products(prod_id,...) VALUES(123,...);
-- SELECT @info

  newProduct03触发器为执行后触发,所以NEW代表插入的数据。

  NEW.prod_id代表插入后的数据123.后续通过SELECT显示出来,

  即每插入一条数据都会显示该数据的prod_id。

  插入前(BEFORE)可以通过SET NEW.xxx = XXX来修改值。

  

   3.2 DELETE触发器

    DELETE触发器的触发事件同样可以是BEFORE,AFTER。

    DELETE中可以引用一张名为OLD的虚拟表,代表删除前或删除后的数据。

    OLD表为只读无法修改,所以BEFORE、AFTER的OLD表代表数据是一样的。

   

    DLETE FROM tableName WHERE id = 1;可看做: 

      OLD.id = 1, OLD.name = 'hcf' ...代表删除前表中所有列的数据。

   BEFORE DELETE TRIGGER...(OLD只读,无法修改,OLD代表删除前数据)

   DELETE FROM tableName WHERE id = OLD.id;  

   BEFORE DELETE TRIGGER...(OLD只读,无法修改,OLD代表删除前数据)

   在删除触发器中编写语句,将删除的数据存放在一张表中,如果出现误操作后续可还原被删除数据。

DELIMITER //
CREATE TRIGGER productsDeleteInfo AFTER DELETE ON products
FOR EACH ROW
BEGIN
INSERT INTO `productsin`(`prod_id`, `vend_id`, `prod_name`, `prod_price`, `prod_desc`)
VALUES(OLD.prod_id, OLD.vend_id, OLD.prod_name, OLD.prod_price, OLD.prod_desc);
END//
DELIMITER ;
DELETE FROM products WHERE prod_id = 'RYL01';

当对products表执行删除操作后,会将删除的数据写入productsin表中。(productsin表要存在)

OLD代表删除前的数据,由于OLD只读不能修改,所以也代表删除后的数据。

  3.3 UPDATE触发器

  UPDATE触发器的触发时机同样分为两种,一种是执行前(BEFORE)、一种是执行后(AFTER)。

  UPDATE触发器中提供OLD表用于访问旧数据,即执行UPDATE语句之前表中的数据。

  无论是BEFORE.还是AFTER,OLD都代表更新前的数据。可以看做是原表中的数据,OLD只读不可修改。

  

  NEW可以看做UPDATE语句中的值,例如UPDATE tableName SET id=2 WHERE id = 1;

  此时NEW.id就代表2,也可以说2就是NEW.id。

  UPDATE tableName SET id=2 WHERE id = 1;语句可看做:

  NEW.id = 2;

  UPDATE BEFORE TRIGGER...(可对NEW.id进行修改; SET NEW.id = xxx)

  UPDATE tableName SET id= NEW.id  WHERE id = 1;

  UPDATE AFTER TRIGGER...  (更新后,不可对NEW.id进行修改)

  

  其中BEFORE TRIGGER是执行UPDATE语句之前的触发器,

  如果在UPDATE BEFORE TRIGGER...中将NEW.id进行修改,

  最后更新的值也会被修改。

  在UPDATE AFTER TRIGGER...中NEW.id就相当于最终更新的值。

  

DELIMITER //
CREATE TRIGGER updateSet BEFORE UPDATE ON products
FOR EACH ROW
BEGIN
SELECT NEW.prod_id, OLD.prod_id INTO @nid, @oid;
END //
DELIMITER ; UPDATE products
SET prod_id = 'GCMH'
WHERE prod_id = ''; SELECT @nid, @oid;

NEW表示更新后的数据,此处为‘GCMH’,old代表更新前数据‘123’;  

  

参考资料:

《MySQL必知必会》

https://www.cnblogs.com/geaozhang/p/6819648.html 

1.8(SQL学习笔记)触发器的更多相关文章

  1. ORALCE PL/SQL学习笔记

    ORALCE  PL/SQL学习笔记 详情见自己电脑的备份数据资料

  2. Oracle之PL/SQL学习笔记

    自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...

  3. SQL学习笔记

    SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...

  4. PL/SQL学习笔记之触发器

    一:触发器响应的事件 数据库操作(DML)语句(DELETE,INSERT,UPDATE) 数据库定义(DDL)语句(CREATE,ALTER或DROP) 数据库操作(SERVERERROR,登录,注 ...

  5. SQL学习笔记七之MySQL视图、触发器、事务、存储过程、函数

    阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...

  6. MySql学习笔记——触发器

    今天又学习了一下mysql触发器的相关知识,对此做了一些笔记和总结. 定义及作用 触发器是一个被指定关联到一个表的数据对象,触发器不需要调用,当对一个表的特别事件出现时,它就会被激活.触发器的代码也是 ...

  7. [Oracle] PL/SQL学习笔记

    -- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...

  8. [SQL学习笔记][用exists代替全称量词 ]

    学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...

  9. SQL学习笔记——SQL初入门,Ubuntu下MySQL的安装

          刚开始接触sql,于是准备在Ubuntu下学习sql,就跟着itercast的sql教程开始入门了. 下面只是我个人的记录,高手请绕道: 一. 在安装之前,我们可以用下面这个命令通过开放端 ...

随机推荐

  1. NYOJ 756 重建二叉树 (二叉树)

    题目链接 描述 题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!). 输入 输入有多组数据(少于100组),以文件结尾结束.每组数据仅一行,包括两个字符串,中间用空格隔开 ...

  2. CSS Sprite笔记

    1. 什么是CSS Sprite 将一些碎小的图片拼接为一张大点的图片来使用,目的是为了减少浏览器的http请求次数以提高网页的加载速度.每次请求图片都需要跟服务器建立一次连接,并且浏览器的最大并发请 ...

  3. Javascript装饰器的妙用

    最近新开了一个Node项目,采用TypeScript来开发,在数据库及路由管理方面用了不少的装饰器,发觉这的确是一个好东西.装饰器是一个还处于草案中的特性,目前木有直接支持该语法的环境,但是可以通过 ...

  4. Go语言 5 函数

    文章由作者马志国在博客园的原创,若转载请于明显处标记出处:http://www.cnblogs.com/mazg/ 今天,我们来学习Go语言编程的第五章,函数.首先简单说一下函数的概念和作用.函数是一 ...

  5. docker ubuntu容器更换阿里源(转)

    问题:使用docker 利用下载的ubuntu镜像启动容器时,使用的源下载更新软件的速度较慢. 解决这个问题的方法是跟新ubuntu容器的源 示例:以ubuntu为基础镜像 启动一个名称为 test0 ...

  6. 高性能优秀的服务框架-dubbo介绍

    先来了解一下这些年架构的变化,下面的故事是我编的.... "传统架构":很多年前,刚学完JavaWeb开发的我凭借一人之力就开发了一个网站,网站 所有的功能和应用都集中在一起,方便 ...

  7. [Leetcode] Search in Rotated Sorted Array 系列

    Search in Rotated Sorted Array 系列题解 题目来源: Search in Rotated Sorted Array Search in Rotated Sorted Ar ...

  8. 安装在Ubuntu上的Python虚拟环境

    安装指南是在 Ubuntu 下面操作的.不同的 Linux 版本,安装指令不同.所以,该指南的某些指令对于像 CentOS 等非 Ubuntu 系统不适用. 为什么需要使用虚拟环境? 虚拟环境是一个将 ...

  9. DBCP object created 日期 by the following code was never closed:

    1.分析 看到标题 DBCP 首先想到的肯定是 数据库连接池哪方面有问题,那么先别着急去解决,不要一股脑就钻进逻辑代码中,然后启用调试就开始一步一步 的分析.我们首先要做的就是想,想想数据库连接池,在 ...

  10. hive学习(四) hive的函数

    1.内置运算符 1.1关系运算符 运算符 类型 说明 A = B 所有原始类型 如果A与B相等,返回TRUE,否则返回FALSE A == B 无 失败,因为无效的语法. SQL使用”=”,不使用”= ...