一、什么触发器

官方定义:触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
    触发器有一个非常好的特性就是:触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。
什么意思,举个例子解释一下,街机游戏大家都玩过吧,闯过一关,闯下一关,有一关没闯过就要从第一关开始。触发器根这个类似。
官方解释如下
    触发程序视为单一交易中的一部份,因此可以由原触发程序还原交易,如果在交易过程中侦测到严重的错误(如使用者中断连线),则会自动还原整个交易。
    他的作用很明显了,可以保重数据的完整性,下面有一个实例来说明他的好处,以及如果使编写代码不那么复杂。

二、触发器语法

create triggertrigger_nametrigger_time trigger_event

on tbl_name for each row trigger_stmt

触发程序与命名为tbl_name的表相关。

trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERT的BEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA语句激活。
可能会造成混淆的例子之一是INSERT INTO .. ON DUPLICATE UPDATE ...语法:BEFORE INSERT触发程序对于每一行将激活,后跟AFTER INSERT触发程序,或BEFORE UPDATE和AFTER UPDATE触发程序,具体情况取决于行上是否有重复键。
    对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。例如,对于某一表,不能有两个BEFORE UPDATE触发程序。但可以有1个BEFORE UPDATE触发程序和1个BEFOREINSERT触发程序,或1个BEFORE UPDATE触发程序和1个AFTER UPDATE触发程序。
trigger_stmt是当触发程序激活时执行的语句。如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。这样,就能使用存储子程序中允许的相同语句

MySQL数据库创建触发器的格式如下:

create trigger <触发器名称>
{ before | after}
{insert | update | delete}
on <表名>
for each row
<触发器SQL语句>

createtrigger<触发器名称>:创建一个新触发器,并指定触发器的名称。
{before|after}:用于指定在insert、update或delete语句执行前触发还是在语句执行后触发。
on<表名>:用于指定响应该触发器的表名。
for each row:触发器的执行间隔,for each row通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>:触发器要执行的SQL语句,如果该触发器要执行多条SQL语句,要将多条语句放在begin…end块中。

三、创建触发器

1.用户表users

create table users (

id int primary key not null auto_incrementcomment '用户id',

name varchar(50) not null default ''comment '名称',

sex int not null default '0' comment '0为男,1为女'

)

insert into users (id, name, sex)values

(1, '张三', 0),

(2,李四, 0);

2.评论表comment

create table comment (

c_id int primary key not nullauto_increment comment '评论id',

u_id int not null comment '用户id',

name varchar(50) not nulldefault '' comment '用户名称',

content varchar(1000) notnull default '' comment '评论内容'

)

insert into comment (c_id,u_id, name, content) values

(1, 1, '张三', '触发器测试'),

(2, 1, '张三', '解决字段冗余'),

(3, 2, '李四', '使代码更简单');

我要做的事情是,当我更新users表的name时,触发器同时更新comment表,就不要写代码去更新了,当用户被删除时,comment表中,有关该用户的数据将被删除

3.触发器更新数据

create trigger updatenameafter update on users for each row  -- 建立触发器,

begin -- old,new都是代表当前操作的记录行,你把它当成表名,也行

if new.name!=old.namethen -- 当表中用户名称发生变化时,执行

update comment setcomment.name=new.name where comment.u_id=old.id;

end if;

end

4.触发器删除数据

create trigger deletecommentbefore delete on users for each row

begin

delete from comment wherecomment.u_id=old.id;

end

5.测试触发器是否可用

a.测试update触发器

update user set name='老王' where id = 1;

b.delete触发器

delete from user  whereid = 1;

四、触发器的优点

1、触发器的"自动性"
    对程序员来说,触发器是看不到的,但是他的确做事情了,如果不用触发器的话,你更新了user表的name字段时,你还要写代码去更新其他表里面的冗余字段,我举例子,只是一张表,如果是几张表都有冗余字段呢,你的代码是不是要写很多呢,看上去是不是很不爽呢。
2、触发器的数据完整性
    触发器有回滚性,举个例子,就是你要更新五张表的数据,不会出现更新了二个张表,而另外三张表没有更新。
    但是如果是用代码去写的话,就有可能出现这种情况的,比如你更新了二张表的数据,这个时候,数据库挂掉了。你就郁闷了,有的更新了,有的没更新。这样页面显示不一致了,变有bug了。

注意:

使用old和new关键字,能够访问受触发程序影响的行中的列(old和new不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。

用old命名的列是只读的。你可以引用它,但不能更改它。对于用new命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。

在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生成的序列号。

MySql触发器以及实例相关推荐

  1. 【无标mysql触发器trigger实例详解

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 目录 什么是触发器 创建 ...

  2. MySQL 触发器简单实例

    from:http://www.qianyunlai.com/blog/470.html ~~语法~~ CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符 ...

  3. mysql触发器和oracle,MySQL与Oracle 差异比较之六触发器

    MySQL与Oracle 差异比较之六触发器 触发器 编号 类别 ORACLE MYSQL 注释 1 创建触发器语句不同 create or replace trigger TG_ES_FAC_UNI ...

  4. 多字段mysql触发器实例_mysql触发器原理与用法实例分析

    本文实例讲述了mysql触发器原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是触发器 创建触发器 单条触发器语句 多条触发器语句 查看触发器 删除触发器 触发器的新旧记录引用 首发日期 ...

  5. MySQL数据库教程之十五:MySQL触发器实例

    MySQL数据库教程之十五:MySQL触发器实例 准备工作: 先启动Navicat for MySQL,建立数据库 建立两个表:Goods(商品表).Orders(订单表) Goods(商品表) cr ...

  6. mySql触发器 trigger详解及实例

    @[TOC]1.什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[ ...

  7. mysql触发器应用场景_MySQL触发器的使用场景及方法实例

    触发器: 触发器的使用场景以及相应版本: 触发器可以使用的MySQL版本: 版本:MySQL5以上 使用场景例子: 每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写 ...

  8. mysql latid1_【转】mysql触发器的实战经验(触发器执行失败,sql会回滚吗) | 学步园...

    1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...

  9. MySQL触发器介绍

    前言: 在学习 MySQL 的过程中,可能你了解过触发器的概念,不清楚各位是否有详细的去学习过触发器,最近看了几篇关于触发器的文档,分享下 MySQL 触发器相关知识. 1.触发器简介 触发器即 tr ...

  10. c mysql触发器,mysql触发器使用笔记

    mysql触发器使用笔记CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_ ...

最新文章

  1. [ZZ]知名互联网公司Python的16道经典面试题及答案
  2. python3遍历电子表格_python 3读取多个文本写入同一个excel,每个文本对应各自独立的 sheet 页...
  3. 禁用outlook2007 垃圾邮件过滤功能
  4. LintCode-56.两数之和
  5. 用UltraIso刻录XP到U盘安装是不行的
  6. Python学习笔记:Day5 编写web框架
  7. 搭建 LEGO EV3 的 PyCharm Python 开发环境
  8. Moblieye副总裁交流纪要
  9. 详细介绍MySQL/MariaDB的锁
  10. python提高导入数据库速度_提高从MongoDB导入数据速度
  11. Gym - 100623J Just Too Lucky (数位dp)
  12. Visio2003 下载
  13. Unity 2019 安装教程
  14. Uber上市即破发 CEO安慰员工:Facebook和亚马逊上市后股价表现也不好
  15. uniapp 树组件 可设置展开层级 可设置回显内容 可设置单选多
  16. Ubuntu设置PPPoE拨号上网
  17. 遭遇盗取网络游戏帐号木马等
  18. osg导入模型时,模型全黑的原因及解决方法分析
  19. 习题 6.10 有一篇文章,共有三行文字,每行有80个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
  20. 随手记_英语_学术写作_常用近义词区分

热门文章

  1. 计算机输入码分类,汉字输入码种类数字编码.ppt
  2. [转贴]深山红叶使用图文教程
  3. Eclipse+Wildfly10 创建第一个EJB项目
  4. nes 红白机模拟器 第4篇 linux 手柄驱动支持
  5. 计算机操作系统|汤小丹|第四版|习题答案
  6. 0动态规划中等 LeetCode97. 交错字符串
  7. cityengine导出fbx
  8. 李晨 | 无人机市场浅析
  9. run rhadoop
  10. 【Fiddler】从零开始学习Fiddler