星空网 > 软件开发 > 数据库

关于Mysql 触发器

首先,测试版本 Mysql 5.6。

然后再看触发器的语法

CREATE  [DEFINER = { user | CURRENT_USER }]  TRIGGER trigger_name  trigger_time trigger_event  ON tbl_name FOR EACH ROW  trigger_bodytrigger_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 rowbegin   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 rowbegin   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 rowbegin   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 rowbegin   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 触发器

关键词:MYSQL

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

亚马逊新手卖家必看-站内广告分析:https://www.ikjzd.com/articles/109958
Listing莫名被下架,亚马逊只给出一句“失误”!:https://www.ikjzd.com/articles/109959
亚马逊人的崩溃,都是静悄悄的!!:https://www.ikjzd.com/articles/10996
怎么做好Wish?Wish运营思路很重要!:https://www.ikjzd.com/articles/109960
出海探路:机遇与风险并存的印度!:https://www.ikjzd.com/articles/109961
国有品牌TOP3,只做1个类目!这样的中国智造,热血!:https://www.ikjzd.com/articles/109962
九月初新疆旅游服装搭配(新疆游玩必备衣服清单):https://www.vstour.cn/a/408257.html
黄果树瀑布景区景点 - 黄果树瀑布景区景点分布图:https://www.vstour.cn/a/408258.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流