1.8(SQL学习笔记)触发器
一、触发器简介
当需要某些操作在某些语句执行之前或之后执行就需要使用触发器。
例如每次插入数据时进行数据校对,每次删除数据后将删除内容备份到新表。
这些操作我们希望它(某些语句)在满足某些条件时自动执行,也可以称为这些条件触发了这些操作。
既然某些操作可以触发某些操作,那么关键要定义两点:
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学习笔记)触发器的更多相关文章
- ORALCE PL/SQL学习笔记
ORALCE PL/SQL学习笔记 详情见自己电脑的备份数据资料
- Oracle之PL/SQL学习笔记
自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家 ...
- SQL学习笔记
SQL(Structured Query Language)学习笔记 [TOC] Terminal登录数据库 1.登录mysql -u root -p ; 2.显示所有数据库show database ...
- PL/SQL学习笔记之触发器
一:触发器响应的事件 数据库操作(DML)语句(DELETE,INSERT,UPDATE) 数据库定义(DDL)语句(CREATE,ALTER或DROP) 数据库操作(SERVERERROR,登录,注 ...
- SQL学习笔记七之MySQL视图、触发器、事务、存储过程、函数
阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名 ...
- MySql学习笔记——触发器
今天又学习了一下mysql触发器的相关知识,对此做了一些笔记和总结. 定义及作用 触发器是一个被指定关联到一个表的数据对象,触发器不需要调用,当对一个表的特别事件出现时,它就会被激活.触发器的代码也是 ...
- [Oracle] PL/SQL学习笔记
-- 1. 使用一个变量 declare -- Local variables here v_name ); begin -- Test statements here select t.user_n ...
- [SQL学习笔记][用exists代替全称量词 ]
学习sql的必经问题. 学生表student (id学号 Sname姓名 Sdept所在系) 课程表Course (crscode课程号 name课程名) 学生选课表transcript (studi ...
- SQL学习笔记——SQL初入门,Ubuntu下MySQL的安装
刚开始接触sql,于是准备在Ubuntu下学习sql,就跟着itercast的sql教程开始入门了. 下面只是我个人的记录,高手请绕道: 一. 在安装之前,我们可以用下面这个命令通过开放端 ...
随机推荐
- 数据类型的判断 --Object.prototype.toString.call(obj)精准检测对象类型
数据类型的判断 typeof typeof返回一个表示数据类型的字符串,返回结果包括:number.boolean.string.symbol.object.undefined.function等7种 ...
- pycharm显示行号
在PyCharm 里,显示行号有两种办法: 1,临时设置.右键单击行号处,选择 Show Line Numbers. 但是这种方法,只对一个文件有效,并且,重启PyCharm 后消失. 2,永久设置. ...
- SQL server(到主机的TCPIPl连接失败的问题)
1 首先要做的是在sql新建查询里输入 exec sys.sp_readerrorlog 0, 1, 'listening' 运行后 会显示你的sql 正在运行的tcp/ip接口 看看是否和你java ...
- i8042 键盘控制器-------详细介绍
[转]http://shanzy.bokee.com/834368.html ps/2 键盘硬件概述 对于驱动来说,和键盘相关的最重要的硬件是两个芯片.一个是 intel 8042 芯片,位于主板上, ...
- Python基础之杂货铺
字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-310 ...
- 手机页面或是APP中减少使用setTimeout和setInterval,因为他们会导致页面卡顿
1.setTimeout致使页面的卡顿或是不流畅,打乱模块的生命周期 ,还有setTimeout其实是很难调试的. 当一个页面有众多js代码的时候,setTimeout就是导致页面的卡顿. var s ...
- nginx解析带中文的url重定向之后404问题
首先,有这样一个需求:一个系统的图片存储是放在upyun上的,现在有个客户需要本地化部署,所以需要将图片进行本地存储.为了兼容,图片存储的路径格式保持和在upyun上的存储路径一致.在upyun上的存 ...
- Activity工作流 -- java运用
一. 什么是工作流 以请假为例,现在大多数公司的请假流程是这样的 员工打电话(或网聊)向上级提出请假申请——上级口头同意——上级将请假记录下来——月底将请假记录上交公司——公司将请假录入电脑 采用工作 ...
- 主机名/etc/hosts文件的作用
1,/etc/hosts,主机名ip配置文件. # Do not remove the following line, or various programs # that require netwo ...
- HDU 1495 非常可乐(BFS倒水问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101) ...