博客出处: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触发器的更多相关文章

  1. 浅谈mysql触发器

    什么是触发器?简单的说,就是一张表发生了某件事(插入.删除.更新操作),然后自动触发了预先编写好的若干条SQL语句的执行.触发器本质也是存储过程,只是不需要手动调用,触发某事件时自动调用.触发器里的S ...

  2. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  3. 浅谈mysql主从复制的高可用解决方案

    1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...

  4. 浅谈mysql innodb缓存策略

    浅谈mysql innodb缓存策略: The InnoDB Buffer Pool Innodb 持有一个存储区域叫做buffer pool是为了在内存中缓存数据和索引,知道innodb buffe ...

  5. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  6. 浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

    浅谈Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景   Mysql共享锁.排他锁.悲观锁.乐观锁及其使用场景 一.相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁 ...

  7. 浅谈MySQL存储引擎-InnoDB&MyISAM

    存储引擎在MySQL的逻辑架构中位于第三层,负责MySQL中的数据的存储和提取.MySQL存储引擎有很多,不同的存储引擎保存数据和索引的方式是不同的.每一种存储引擎都有它的优势和劣势,本文只讨论最常见 ...

  8. 重新学习MySQL数据库6:浅谈MySQL的中事务与锁

    『浅入深出』MySQL 中事务的实现 在关系型数据库中,事务的重要性不言而喻,只要对数据库稍有了解的人都知道事务具有 ACID 四个基本属性,而我们不知道的可能就是数据库是如何实现这四个属性的:在这篇 ...

  9. (转)运维角度浅谈MySQL数据库优化

    转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...

随机推荐

  1. list集合为空或为null的区别

    简述 判断一个list集合是否为空,我们的惯性思维是判断list是否等于null即可,但是在Java中,list集合为空还是为null,这是两码事. 新建一个list对象,默认值是空,而非null: ...

  2. HTML5入门(一)—— 基本标签&表格

    一.HTML简介 超文本标签语言,即网页的源码.而浏览器就是翻译解释HTML源码的工具. 二.HTML Head部分      <1>Head的作用 用于描述网页的一些关键信息.比如网页的 ...

  3. 使用xlrd模块从excel文件中导入数据

  4. Javascript随笔2(JQuery)

    1.jQuery 语法 Tips: 通过 CDN(内容分发网络)引用JQuery:(link的引用最好放在script的引用之前) <script src="http://apps.b ...

  5. 从SVN到Git最强指南

    对于软件开发人员来说,版本控制系统他们再熟悉不过了,所谓版本控制系统就是软件项目开发过程中用于储存开发人员所写代码所有修订版本的软件.它的主要目的是实现开发团队并行开发.提高开发效率,对软件开发进程中 ...

  6. 调整ORACLE用户关闭密码有效期

    --调整ORACLE用户关闭密码有效期  ----------------------------------2013/11/12 在oracle中执行一下操作:1.查看用户的proifle是那个,一 ...

  7. 搭建 keras + tensorflow

    每次搭建深度学习环境的总要搜索各类参考.  这次搭环境,自己做个记录.这样以后搭建环境就拿自己 的文章做主线索引.  (如果参照我的博客安装的,欢迎转载分享 ) 1. 安装操作系统 (ubuntu-1 ...

  8. Android图片轮播控件

    Android广告图片轮播控件,支持无限循环和多种主题,可以灵活设置轮播样式.动画.轮播和切换时间.位置.图片加载框架等! 使用步骤 Step 1.依赖banner Gradle dependenci ...

  9. 一个基于JRTPLIB的轻量级RTSP客户端(myRTSPClient)——解码篇:(二)用ffmpeg解码音频

    其实这篇的内容和(一)用ffmpeg解码视频基本是一样的,重点还是给ffmpeg指定callback函数,而这个函数是从RTSP服务端那里获取音频数据的. 这里,解码音频的示例代码量之所以比解码视频的 ...

  10. 8.23.2 IO-输入输出规范代码

    文件路径4种写法: 相对路径,相对当前而言,在当前路径下找: String filePath = "temp01";  绝对路径: String filePath = " ...