猎八哥浅谈MYSQL触发器
博客出处:http://www.cnblogs.com/liebagefly/p/7517998.html
什么是MYSQL触发器,我们先了解一下触发的意思。触发的字面意思是指因触动而激发起某种反应。
MYSQL必知必会中对触发器的解释是:MySQL响应以下任意语句而自动执行的一条或多条MySQL语句(或位于 BEGIN 和 END 语句之间的一组语句)。其中以下任意语句是指:delete,insert,update。
我对mysql中触发器的理解是mysql数据库的数据内容造成改变时(增加、删除、添加)执行的一个行为。
特别注意:当你进行查询数据时无法调动触发器(我的理解是此时数据库中的内容无法发生改变调用触发器没有意义,因为触发器的作用是进行了数据库的备份,保证安全性等)。触发器被调动后所执行的行为(或者说是MySQL语句)中有增加、删除、添加。
触发器的作用和意义:数据备份,数据同步,保证安全性。具体请看以下几种案例。SHOW TRIGGERS; 查看表中所有触发器。
1.案例一,使用触发器用来数据备份。
场景:在学生表中,在删除id为3的学生信息之前时,将这条要删除的信息插入到studentbackup表中,用来做备份。执行delete时产生触发行为。具体代码如下(有解析)。
学生表
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`zongfen` int(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk
学生备份表
CREATE TABLE `studentbackup` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`zongfen` int(255) DEFAULT NULL,
deletetime datetime,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk 创建触发器
CREATE trigger deletestudent before delete on student
for each ROW
begin
insert into studentbackup (id,name,zongfen,deletetime)
values(OLD.id,OLD.name,OLD.zongfen,NOW());
end;
解释:
CREATE trigger deletestudent是指创建一个名为deletestudent的触发器,由于是在执行之前做备份所以此处使用before,
delete on student是指student执行delete行为时有触发行为,
for each row的汉语意思是每一行,用在这里表示当每一行受到影响时,触发器都会被启动,
begin,end是触发器开始和结束的标记,
begin和end之间的语句是触发器被调动后所执行的行为,这里新增了一个字段deletetime,它用来记录删除时间,有关mysql中时间的调取方法我会在其他博客中做详细说明。
执行删除语句
delete from student where id=3;
执行完这条delete后,我们会发现学生表的一条信息被删除,而这条删除的信息在备份表中被插入。
删除一条信息前后两表的信息

删除之前

删除之后
2.案例二,使用触发器用来数据同步。
场景:在学生表中有四条信息,学生1表中有四条相同的信息,当学生表中插入一条信息时,学生1表中会产生一条相同的新的信息(即学生表1和学生表的信息均相同)。执行insert时产生触发行为。
学生表1
CREATE TABLE `student1` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`zongfen` int(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk 创建触发器
CREATE trigger insertstudent after insert on student
for each ROW
begin
insert into student1 (id,name,zongfen)
values(new.id,new.name,new.zongfen);
end;
执行插入语句
insert into student (id,name,zongfen) values(5,'e',195);
插入前后两表内容:

插入之前

插入之后
3.案例三:使用触发器用来数据备份和同步。
更改学生表的信息,这个情况比案例一和案例二都较为复杂。因为当进行学生表信息更新时,在更改之前要将信息进行备份,更改之后要将更改后的信息更新到同步表中。话不多说直接上代码。
在更新之前将数据备份
CREATE trigger updatestudent before update on student
for each ROW
begin
insert into studentbackup (id,name,zongfen,deletetime)
values(old.id,old.name,old.zongfen,NOW());
end;
更新之后将数据同步到同步表中,备注一下:我们暂不考虑更新时更改id这种行为,
因为id没有改变,所以这里where id = old.id;或者where id = new.id;均正确,
CREATE trigger updatestudent1 after update on student
for each ROW
begin
UPDATE student1 set name = new.name,zongfen = new.zongfen
where id = old.id;
end; 执行更新语句
UPDATE student set name = 'z',zongfen = 100 where id = 4;
数据更新前后:

更新之前

更新之后
:4.案例四:将学生表中成绩最高的学生信息,导入到maxgrade中去。话不多说,直接上代码。
begin
DELETE from maxgrade;
select max(zongfen) into @maxzongfen from student;
select id into @idmax from student where zongfen=@maxzongfen;
select name into @namemax from student where zongfen=@maxzongfen;
insert into maxgrade(id,name,zongfen)value(@idmax,@namemax,@maxzongfen);
end;
insert student values(4,'d',177);

之前

之后
触发器的特点:
1.触发行为只能在之前或者之后执行(before,after)。
2.触发器的命名可以重复(这里的重复是指两个不同的表可以起一个相同的触发器名字,但是每个表中的不同触发器的命名必须不同;但从程序的可读性等发面考虑还是应该在整个数据库中每个触发器的命名都应该不同,这种命名重复在我看来是MYSQL的弊端)。
3.触发器可以产生增删改三种行为。
4.触发器不能被覆盖或者修改,要更改触发器时需要先删除它,然后新建。
删除语句drop TRIGGER 触发器名字;
5.begin和end之间可以插入多条sql语句。
6.触发器内不能调用存储过程。
7.每张表最多可以建6个触发器,分别是增加、删除、添加行为前后。
8.视图不支持触发器。
备注一下:我得MYSQL版本为5.5.40。(查询语句为:select version();)
转载本博客请在明显位置表明出处:http://www.cnblogs.com/liebagefly/p/7517998.html
(谢谢配合,近期发现众多网站在引用本博客时不表明出处,故在此说明一下。)
猎八哥浅谈MYSQL触发器的更多相关文章
- 浅谈mysql触发器
什么是触发器?简单的说,就是一张表发生了某件事(插入.删除.更新操作),然后自动触发了预先编写好的若干条SQL语句的执行.触发器本质也是存储过程,只是不需要手动调用,触发某事件时自动调用.触发器里的S ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- 浅谈mysql innodb缓存策略
浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...
- 浅谈mysql配置优化和sql语句优化【转】
做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...
- 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景
浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...
- 浅谈MySQL存储引擎-InnoDB&MyISAM
存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的.每一种存储引擎都有它的优势和劣势,本文只讨论最常见 ...
- 重新学习MySQL数据库6:浅谈MySQL的中事务与锁
『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇 ...
- (转)运维角度浅谈MySQL数据库优化
转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
随机推荐
- ue4(c++) 按钮中的文字居中的问题
.Content() [ SNew(SOverlay) + SOverlay::Slot().HAlign(HAlign_Center).VAlign(VAlign_Center) [ SNew( ...
- Git时光机穿梭
我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容: Git is a distributed version c ...
- swift3.0 屏幕截图并且保存到本地相册
所要截取的对象 var bg_view: UIView! 截取并且保存的代码如下 UIGraphicsBeginImageContextWithOptions(bg_view.frame.size, ...
- nginx实现请求的负载均衡 + keepalived实现nginx的高可用
前言 使用集群是网站解决高并发.海量数据问题的常用手段.当一台服务器的处理能力.存储空间不足时,不要企图去换更强大的服务器,对大型网站而言,不管多么强大的服务器,都满足不了网站持续增长的业务需求.这种 ...
- [Poi2010]Monotonicity 2 线段树
这道题考试的时候先打了个dfs暴力.又打了个O(n²)的动规.然后竟然心血来潮拍了一下..明明知道过不去的...然后水了50分(20个测试点这么多啊啊啊啊). 因为它已经提前给你如果长度为i时下一位的 ...
- 创建 macvlan 网络 - 每天5分钟玩转 Docker 容器技术(55)
上一节我们准备好了 macvlan 的实验环境,今天在 host1 和 host2 中创建 macvlan 网络 mac_net1: 注意:在 host2 中也要执行相同的命令. ① -d macvl ...
- [算法题] 3Sum Closest
题目内容 Given an array S of n integers, find three integers in S such that the sum is closest to a give ...
- Java重定向和转发的路径问题
路径问题: ①相对路径和绝对路径: 绝对路径: 绝对路径是以/开头的路径! 相对于当前服务器的绝对路径: 如果是服务器解析,那么/ ...
- es6五种遍历对象属性的方法 - 表格整理
ES6 一共有5种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性). (2)Object.keys(obj) Obje ...
- 使用Servlet实现上传文件功能
1.servlet只需加上一个注释和用request.getPart来获取文件的值,这是servlet3.0的API 2.表单需要加上一个属性enctype="multipart/form- ...