博客出处: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,

deletetimedatetime,PRIMARY KEY(`id`)

) ENGINE=MyISAM DEFAULT CHARSET=gbk

创建触发器CREATE trigger deletestudent before delete onstudentforeach ROWbegin

insert intostudentbackup (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 onstudentforeach ROWbegin

insert intostudent1 (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 onstudentforeach ROWbegin

insert intostudentbackup (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 onstudentforeach ROWbegin

UPDATE student1 set name = new.name,zongfen =new.zongfenwhere id =old.id;end;

执行更新语句

UPDATE student set name = 'z',zongfen = 100 where id = 4;

数据更新前后:

更新之前

更新之后

:4.案例四:将学生表中成绩最高的学生信息,导入到maxgrade中去。话不多说,直接上代码。

begin

DELETE frommaxgrade;select max(zongfen) into @maxzongfen fromstudent;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触发器相关推荐

  1. 猎八哥浅谈存储过程——数据库中的双刃剑

    存储过程是指:为完成特定任务的一条或多条MYSQL语句的集合. 猎八哥原创,本文原址链接:http://www.cnblogs.com/liebagefly/p/7521974.html 存储过程的优 ...

  2. 支付宝的数据库是MySQL变种_浅谈MySql的储存引擎(表类型)

    浅谈mysql的存储引擎(表类型) 什么是MySql数据库 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合. 我们通常说的MySql数据库, ...

  3. mysql 用户通配符_浅谈mysql通配符进行模糊查询的实现方法

    在mysql数据库中,当我们需要模糊查询的时候 ,我们会使用到通配符. 首先我们来了解一下2个概念,一个是操作符,一个是通配符. 操作符 like就是SQL语句中的操作符,它的作用是指示在SQL语句后 ...

  4. mysql declare与set的区别_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  5. mysql维护计划任务_浅谈MySQL event 计划任务

    一.查看event是否开启 show variables like '%sche%'; set global event_scheduler =1; 二. -- 设置时区并设置计划事件调度器开启,也可 ...

  6. mysql 计划任务消耗_浅谈MySQL event 计划任务

    一.查看event是否开启 show variables like '%sche%'; set global event_scheduler =1; 二. -- 设置时区并设置计划事件调度器开启,也可 ...

  7. mysql事务的管理方式_浅谈MySQL事务管理(基础)

    本篇文章给大家带来的内容是浅谈MySQL事务管理(基础),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助.事务处理用来维护数据库等完整性,保证mysql操作要么成功,要么失败(myisa ...

  8. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  9. mysql存储过程set什么意思_浅谈MySQL存储过程中declare和set定义变量的区别

    在存储过程中常看到declare定义的变量和@set定义的变量.简单的来说,declare定义的类似是局部变量,@set定义的类似全局变量. 1.declare定义的变量类似java类中的局部变量,仅 ...

  10. mysql revoke 授权_浅谈MySQL中授权(grant)和撤销授权(revoke)用法详解

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利 grant selec ...

最新文章

  1. 15 - 使用 Fabric 自动化部署
  2. 设置超链接文字的样式
  3. cvc 降噪_耳机降噪技术有哪几种?
  4. linux的用户管理与权限学习总结
  5. 计算机应用基础在线作业南开,2017南开计算机应用基础在线作业满分的答案.doc...
  6. Maven+eclipse快速入门
  7. fastjson导致的OOM
  8. 最佳实践:使用负载均衡SLB IPv6搞定苹果AppStore审核
  9. LeetCode - 35. Search Insert Position
  10. java 数据库外键查询_oracle中查询所有外键引用到某张表的记录
  11. 配置IIS服务器,支持sis下载
  12. SQL多表合并查询结果
  13. WinForm开发(36)——WinForm开发微软官方最全综合详解指南(包括bug出现的可能原因分析及解决方法)
  14. jquery ui php,推荐10款最热门jQuery UI框架[原创]_jquery
  15. Linux 就该这么学
  16. 网站弹窗广告html,网站弹窗广告(彻底关闭浏览器的广告弹窗?)
  17. 运动会加油稿计算机学院150字,学校运动会加油稿150字10篇
  18. 计算机课拔线头检讨书,乱接电线检讨书
  19. 提高信息系统的安全防护能力,一篇文章带你了解等保测评的重要性
  20. PackageManagerService根据权限等级管理权限流程分析(默认赋予apk权限)

热门文章

  1. Android10 lowmemorykiller
  2. EHub_tx1_tx2_E100 测试VisionWorks跑自带的demo
  3. JavaScript-标签语句
  4. VUE PC端和移动端适配
  5. python 快乐数判断_利用Python实现MACD顶底背离形态,并实现自动化交易!
  6. 未安装360系列应用情况下,Edge浏览器主页被360篡改,一直显示360导航
  7. Linux 重置root密码
  8. 【密码学/密码分析】基于TMTO的密码分析方法
  9. 详解TCP 三次握手和四次挥手
  10. Linux Ubuntu输入法安装设置及中文字体安装