猎八哥浅谈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 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架 ...
随机推荐
- C# 6.0 内插字符串 (Interpolated Strings )
讲Interpolated Strings之前,让我们先看EF Core 2.0 的一个新的特性:String interpolation in FromSql and ExecuteSqlComma ...
- redis单机安装以及简单redis集群搭建
安装环境: 两台虚拟机都是Centos 7.0 IP分别为:192.168.149.132 192.168.149.133 Redis采用的版本是redis-3.2.4 集群是采用两台虚拟机模拟8个 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(999)-如何使用这个系统来开发?
前言 这篇文本讲述了这个框架的使用方式,及一些疑问的答疑,更加精准的使用这个框架来建立功能 经过几个版本的迭代,系统使用更加方便,代码更加简洁也更加的智能,所以之前61节的文章也需要重新编排 对项目的 ...
- 《Java从入门到放弃》入门篇:springMVC数据传递
springMVC中的数据传递方式与JSP和Struts2相比,更加的简单.具体有什么样的区别呢?我们通过下面这张图来对比就知道了. 随手画的,有些错别字,不用太在意..... 接下来,进入正题,sp ...
- 第一个简单的python程序,模拟购物车
第一个pyhone程序,简单的购物车功能,刚开始学习,练习下手感. #/usr/bin/env python#-*- coding:utf-8 -*- salary = int(raw_input(& ...
- oracle 表空间 表权限 用户
启动数据库命令分为三个阶段: 1.查看所有用户:select * from dba_user;select * from all_users;select * from user_users;2.查看 ...
- CentOS 7 服务器配置--安装MongoDB
#下载MongoDB源文件: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.4.7-tgz 注意:wget此处 ...
- 第一次使用windows版的Git,附上一些配置和最常用的git命令
Git配置:git config --global user.name "用户姓名" git config --global user.emall "用户邮箱" ...
- Maven详解(三)------ Maven工程目录介绍
上一章我们配置并安装好了 Maven,那么这一章我们介绍如何用eclipse创建一个 Maven 工程,然后介绍 Maven 工程的目录结构. 1.eclipse 创建 Maven 工程 第一步:Fi ...
- php基本函数
//1.随机数和时间 //echo rand(); 随机数生成器,生成随机数 //echo rand(a,b); 生成a~b之间的随机数 //echo time(); 生成当前的Unix时间戳 //e ...