猎八哥浅谈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 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
随机推荐
- hdu--1072--Nightmare(bfs回溯)
Nightmare Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total S ...
- MyBatis String类型传递参数注意事项
Mybatis查询sql传入一个字符串传参数,报There is no getter for property named 'ids' in 'class java.lang.String'. 后来改 ...
- kafka在windows下的安装和配置
博主最近在学习有关kafka的配置安装以及在spring的集成使用.但网上关于kafka的配置参考资料基本都是于linux下的配置,于是博主在整理了相关windows下kafka的配置记录在博客里.由 ...
- H5滚动轮播插件
概述 JRedu 随着前端技术的发展,越来越多的H5技术被应用到实际开发中,尤其是js插件更是无处不用,本章节我们主要分享下如何去自己封装一个滚动轮播插件. 1效果图如下: 2主要功能 支持超 ...
- HttpClient笔记与踩过的坑
本来有个指纹采集功能做了个winFrom小程序 在本地测试都还能行,后来快上线的时候发现 客户用的阿里云数据库, 不对外公布 ,然后发现本地采集的数据没办法上传到数据库怎么办呢? 然后曲线救国,用we ...
- 链接样式L-O-H-A
伪类可以链接起来使用,即不用在乎顺序 :link{color:blue;} :visited{color:purple;} :link:hover{color:red;} :visited:hover ...
- 【有意思的BUG】浏览器的Title和Icon
序:Icon在术语上也称为"ico",比如豆瓣的ICON地址:http://img3.douban.com/favicon.ico 先贴一张图,有助于理解这篇文档的标题--< ...
- 纯JavaScript实现异步Ajax的基本原理
Ajax实际就是XMLHttpRequest对象和DOM.(X)HTML和CSS的简称,用于概括异步加载页面内容的技术. Ajax实例 HTML代码如下,包含一个h5标题和一个按钮: JS代码如下 ...
- 【.Net Core 2.0 生态】-- 好文收藏
随笔分类 - .NET Core - dotNet实训营 .Net Core 2.0 生态(1).NET Standard 2.0 特性介绍和使用指南 .Net Core 2.0 生态(2).NET ...
- [Python] wxPython 状态栏组件、消息对话框组件 学习总结(原创)
1.状态栏组件 1.基本介绍 上图: 红框框内的就是状态栏. 他可以分成若干个区块,比如上者分为了两个区块,并且比例是固定的,创建时可以指定 每个区块都能够显示 信息,一般通过 绑定事件 实时更新 各 ...