博客出处: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. 在 overlay 中运行容器 - 每天5分钟玩转 Docker 容器技术(51)

    上一节我们创建了 overlay 网络 ov_net1,今天将运行一个 busybox 容器并连接到 ov_net1: 查看容器的网络配置: bbox1 有两个网络接口 eth0 和 eth1.eth ...

  2. 两个List比较各自对象的属性相同的问题

    最近做checkbox默认勾选的时候,涉及到两个list直接比较彼此对象的Id属性是否相同的问题.能力有限,想到这个笨方法. 创建一个Bean: public class Bean { private ...

  3. 友盟崩溃日志分析工具 - dSYMTools

    公司的项目中集成了UM的统计功能,UM统计可以统计app的用户新增,版本分布,日志崩溃等信息,打开错误分析按钮,则可能会看到很多崩溃的日志信息 选择编辑可以选择更多的版本号 点击列表中的一个崩溃日志, ...

  4. SecureCRT-转换密钥-Xshell-配置服务-使用xshell登录远程linux服务器

    这篇文档不保证正确,仅仅是备份个因为所以,不必当真. SecureCRT和xShell这2个工具功能类似,均可以控制远程服务器模拟并发用户. SecureCRT自带功能可以将私钥转换为xShell可用 ...

  5. winform 自定义控件的使用

    c#的自定义控件还是很方便的,至少相对于c++而言. 1,当然是建立一个windows 窗体空间库,我这里就是用vs 2015 ,工程名MyControl 第二步.在自定义空间窗体内,拖放这样一组空间 ...

  6. 浅谈分析表格布局与Div+CSS布局的区别

    (1)表格布局 表格布局容易掌握,布局方便.但表格布局需要通过表格的间距或者使用透明的gif图片来填充布局板块间的间距,这样布局的网页中表格会生成大量难以阅读和维护的代码:而且表格布局的网页要等整个表 ...

  7. noip普及组2004 不高兴的津津

    描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会不高兴,而且, ...

  8. iOS app 逆向过程(持续更新完善)

    一.获取待逆向的app 1.用cyder2直接从源里下载,适合逆向越狱开发的软件. 2.从pp助手中下载,pp助手中有越狱应用和正版应用.越狱应用直接是已经脱壳的,未越狱应用还需要执行砸壳 二.获取待 ...

  9. Android辅助功能原理与基本使用详解-AccessibilityService

    辅助功能原理与基本使用详解 本文主要介绍辅助功能的使用 辅助功能基本原理 辅助功能基本配置和框架搭建 辅助功能实战解析 辅助功能基本原理   辅助功能(AccessibilityService)其实是 ...

  10. PHPcms9.6.0任意文件上传漏洞直接getshell 利用教程

    对于PHPcms9.6.0 最新版漏洞,具体利用步骤如下: 首先我们在本地搭建一个php环境,我这里是appserv或者使用phpnow (官网下载地址:http://servkit.org/) (只 ...