首先,测试版本 Mysql 5.6。

然后再看触发器的语法

CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
trigger_body trigger_time: { BEFORE | AFTER } trigger_event: { INSERT | UPDATE | DELETE }

这个是联机文档里面查到的资料。其实语法也挺简单。下面上栗子
首先我们先创建2个测试表
CREATE TABLE `test` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Col1` varchar(50) DEFAULT NULL,
`Col2` varchar(50) DEFAULT NULL,
`Col3` int(11) DEFAULT NULL,
`Col4` float DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; CREATE TABLE `testTri` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Col1` varchar(50) DEFAULT NULL,
`Col2` varchar(50) DEFAULT NULL,
`Col3` int(11) DEFAULT NULL,
`Col4` float DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

因为只是用于测试,结构上我就随便建了,就创建一个自增列主键就ok了。

然后在testTri表创建一个触发器(创建一个最简单的触发器奏是这样子,简单吧╮(╯_╰)╭)

drop trigger if exists TR_testTri;
delimiter //
create trigger TR_testTri after insert on testTri for each row
begin
insert into test(Col1,Col2,Col3,Col4) values (1,2,3,5);
end//
delimiter ;
然后再 testTri 上面添加一行记录,明显,很顺利地,test表也增加了一行记录。

insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4);

结果 test 和 testTri 都写入了一行的记录。
正常的情况就写到这里了。当然罗 Insert 是这样玩,Update/Delete 也是这样玩, Before /After 在mysql 里面也只是执行顺序问题而已。 然后我就测试了集中情况。
1 触发器自行递归,在表 testTri 创建一个触发器,触发内容就是往 testTri 写入一条记录。做一下实验
drop trigger if exists TR_testTri;
delimiter //
create trigger TR_testTri after insert on testTri for each row
begin
insert into TR_testTri(Col1,Col2,Col3,Col4) values (1,2,3,5);
end//
delimiter ;
创建成功,语法上并没有任何问题。然后添加一行记录 
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4);

然后华丽丽地报错了。
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4) Error Code: 1442. Can't update table 'testtri' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 0.047 sec 所以验证了不能自己递归自己。 2 2个表相互循环递归,在test 和 testTri 都创建一个触发器,相互写入数据
drop trigger if exists TR_testTri;
delimiter //
create trigger TR_testTri after insert on testTri for each row
begin
insert into test(Col1,Col2,Col3,Col4) values (1,2,3,5);
end//
delimiter ; drop trigger if exists TR_testTri2;
delimiter //
create trigger TR_testTri2 after insert on test for each row
begin
insert into testTri(Col1,Col2,Col3,Col4) values (1,2,3,6);
end//
delimiter ;
创建成功,语法上并没有任何问题。然后添加一行记录 
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4);

然后华丽丽地又报错了。
insert into testTri (Col1,Col2,Col3,Col4) values (1,2,3,4) Error Code: 1442. Can't update table 'testtri' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 0.047 sec

证明这种循环引用也是不被允许的。

做了一个这样的简单实验。证明了mysql 在触发器里面不适宜玩太高级的逻辑,不然真的不知道到底错误是怎样出现的。但是相对来说,对于程序的控制也会容易一些,也是有友好的一面~
PS:在下对Mysql 不甚熟练~还请大家指导

关于Mysql 触发器的更多相关文章

  1. MySQL触发器如何正确使用

    MySQL触发器如何正确使用 2010-05-18 15:58 佚名 博客园 字号:T | T 我们今天主要向大家介绍的是MySQL触发器进行正确使用,其中包括对MySQL触发器发器的语句创建,触发时 ...

  2. 【转】mysql触发器的实战(触发器执行失败,sql会回滚吗)

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

  3. redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)

    一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...

  4. mysql触发器的例子--插入前更新数据

    本文介绍下,一个mysql触发器的例子,在数据插入前更新相关内容,有需要的朋友参考下. mysql触发器的例子,如下: view source print? 001 mysql> CREATE  ...

  5. mysql触发器的作用及语法

    触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有下面的作用: 1.安全性.能够基于数据库的值使用户具有 ...

  6. MySQL 触发器结构及三个案例demo

    --你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了.这跟SQL的标准有所不同. CREATE TRIGGER语法 CREATE TRIGG ...

  7. 利用MySQL触发器实现check和assertion

    MySQL虽然输入check语句不会报错,但是实际上并没有check的功能.但是MySQL 依然可以利用触发器来实现相应功能. 本文将根据两个例子简要阐述MySQL实现check和assertion的 ...

  8. 猎八哥浅谈MYSQL触发器

    什么是MYSQL触发器,我们先了解一下触发的意思.触发的字面意思是指因触动而激发起某种反应. MYSQL必知必会中对触发器的解释是:MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于 B ...

  9. MYSQL触发器在PHP项目中用来做信息备份、恢复和清空

    案例:通过PHP后台代码可以将员工的信息删除,将删除的员工信息进行恢复(类似于从回收站中恢复员工信息),并且还可以将已经删除的员工进行清空(类似于清空回复站的功能). 思路:要有一张员工表,还要有一张 ...

  10. MySQL触发器在PHP项目中用来做信息备份、恢复和清空的方法介绍

    案例:通过PHP后台代码可以将员工的信息删除,将删除的员工信息进行恢复(类似于从回收站中恢复员工信息),并且还可以将已经删除的员工进行清空(类似于清空回复站的功能). 思路:要有一张员工表,还要有一张 ...

随机推荐

  1. TODO:字节的那点事Go篇

    TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...

  2. Objective-C中NSInvocation的使用

    OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocation. 第一个PerformaceSelector比较常 ...

  3. Android WebView 优化页面加载效果

    目前带有Web功能的APP越来越多,为了能够更好的使用WebView展示页面,可以考虑做相关的优化:WebView 缓存,资源文件本地存储,客户端UI优化. 可能有些人会说,为什么不做Native的, ...

  4. SQL Server 存储中间结果集

    在SQL Server中执行查询时,有一些操作会产生中间结果集,例如:排序操作,Hash Join和Hash Aggregate操作产生的Hash Table,游标等,SQL Server查询优化器使 ...

  5. Oracle位图索引

    索引由KEY和Data组成 位图索引的KEY比普通非唯一性索引多包含一个组成部分,分区,分区是将数据按行由内部机制分段以达到比较好的检索效率 位图索引的Data中,该索引KEY中数据值在分区段中按行分 ...

  6. html5+go+websocket简单实例代码

    这次的就直接发放代码截图吧,应该是用go语言做后台一个简易的聊天,这里没用到什么特别的知识,最朴实的来实现效果,主要目的是分享下h5怎么用websocket,go搭建websocket服务的主要部分. ...

  7. 快速打造跨平台开发环境 vagrant + virtualbox + box

    工欲善其事必先利其器,开发环境 和 开发工具 就是 我们开发人员的剑,所以我们需要一个快并且好用的剑 刚开始做开发的时候的都是把开发环境 配置在 自己的电脑上,随着后面我们接触的东西越来越多,慢慢的电 ...

  8. linux内核调试技术之修改内核定时器来定位系统僵死问题

    1.简介 在内核调试中,会经常出现内核僵死的问题,也就是发生死循环,内核不能产生调度.导致内核失去响应.这种情况下我们可以采用修改系统内核中的系统时钟的中断来定位发生僵死的进程和函数名称.因为内核系统 ...

  9. iFrame 功能详解

    目录索引: 一. 简介二. 属性三. 功能四. 应用 一.简介 网页“帧”的概念最早是由Netscape所提出,当时全部由“帧”构成的页面,也被称之为 “框架集”页面,在一个“框架集”页面中,“帧” ...

  10. .Net语言 APP开发平台——Smobiler学习日志:如何实现快速跳转网页

    Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.跳转网页代码(Button的Click事件) Private Sub Button1_ ...