MySQL触发器

MySql触发器参看文档
触发器:在指定表上,(insert(插入)、update(跟新)、delete(删除))事件动作,触发(After(之后)时机,Before(之前)),执行指定的一群或一个sql语句。
(举例解释:就是在delete删除之前(before)或之后(after)执行指定一个或一群sql语句)
MySQL支持触发器:在Mysql 5.0版本以上。在doc命令查看mysql版本命令(mysql --version)


  • 关于触发器在Navicat for MySql上的使用教程
  • 关于mysql命令的使用情况。

在mysql中创建

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH 
ROW trigger_stmt

trigger_name : 触发器名称,用户自行指定
trigger_time: 触发时机,取值BEFORE(之前)、AFTER(之后)
trigger_event : 出发事件,INSERTUPDATEDELETE。(插入、更新、删除)
tbl_name : 需要建立触发器的表名。
trigger_stmt : 触发程序体,可以是一条SQL语句或是BEGINEND包含的索条语句

  • 由上面,可以知道MYSQL可以创建6种类型的触发器。
    BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE
    AFTER INSERT、AFTER UODATE、AFTER DELETE
  • 并且一张表上不能创建两个相同类型的触发器,因此一张表上面最多能创建6种类型的触发器。

  • trigger_event详解

INSERT型触发器 :插入某一行时激活触发器,可能INSERT、LOAD DATA、REPLACE语句触发。
UPDATE型触发器 : 更改某一行时激活触发器,可能通过UPDATE语句触发。
DELETE型触发器 : 删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发。

  • LOAD DATA:语句用于将一个文件装入到一个数据表中,相当于一系列的INSERT操作。参考文档
  • REPLACE:语句和INSERT语句很像,只是在表中有primary keyunique索引时,如果插入的数据和原来的primary keyunique索引一致时,会先删除原来的数据,然后增加一条新的数据,就是REPLACE语句有时候等价一条INSERT语句,有时候等价一条DELETE语句加上一条INSERT语句。

  • BEGIN...END详解

  • 在Mysql中,BEGIN...END语句的语法为:

BEGIN
[statement_list]
END

statement_list:使用方法
statement_list 代表一个或多个语句的列表,列表内的每条语句都必须用分号(;)来结尾(默认值)
我们可以使用DELIMITERE指定自定义的定界符。
DELIMITER new_delemiter
new_delemiter 可以设为1个或多个长度的符号,默认的是分号(;),我们可以把它修改为其他符号,如:`DELIMITER(**注意**:我们修改了定界符使用完了,记得修改回来DELIMITER ;`)
参考代码

image

Mysql中使用DECLARE来定义一句局部变量,该变量只能在BEGIN...END复合语句中使用,并且应该定义在复合语句的开头。
DECLARE var_name[,...] type [DEFAULT value]
var_name:变量名称,同 SQL 语句一样,变量名不区分大小写
type:数据类型MySQL 支持的任何数据类型,可以同时定义多个同类型的变量,用逗号隔开
DEFAULT:变量初始值为 NULL,如果需要,可以使用 DEFAULT 子句提供默认值,值可以被指定为一个表达式
对变量赋值采用SET语句
SET var_name = expr [,var_name = expr] ...
NEW与OLD关键字
该关键字,表示触发了触发器的那一行数据。
INSERT触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据。
UPDATE触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为的新数据。
DELETE触发器中,OLD用来表示将要或已经被删除的原数据。
使用方法NEW.columnName(columnName为相应数据表某一列名)
另外,OLD 是只读的,而 NEW 则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用(如每插入一个学生前,都在其学号前加“2013”)


  • 查看触发器

  • 查看触发器就和查看数据库show databases;或查看表格show tables;一样。

  • 查看触发器SHOW TRIGGERS [FROM schema_name],这里的schema_name表示的是表名称。


  • 删除触发器

  • 和删除数据表、删除表格一样,语法如下:

  • DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name


  • 触发器的执行顺序

  • 触发器建立的一般是InnoDB数据库,上面要使用的表也是要事务支持的。
    1.如果BEFORE触发器执行失败,SQL无法正确执行。
    2.SQL执行失败时,AFTER型触发器不会触发。
    3.AFTER类型的触发器执行失败,SQL会回滚。


Mysql触发器的使用举例:

  • Mysql触发器案例:
CREATE TRIGGER test_tt AFTER DELETE ON `test`  FOR EACH ROW
BEGIN
DECLARE s VARCHAR(20) DEFAULT 'hello';
SET s = 'world';
UPDATE `member` SET `name` = s WHERE id = OLD.id;
END

当在删除test表的数据时,会在对应的member对应的id中添加name字段值为world。

  • 如果使用下面这种sql语句,一值得到null。
CREATE TRIGGER test_tt AFTER DELETE ON `test`  FOR EACH ROW
BEGIN
DECLARE s VARCHAR(20) DEFAULT 'hello';
SET s= (select name from test where id = old.id);
SET s = concat('a','hello');
UPDATE `member` SET `name` = s WHERE id = OLD.id;
END

这是由于select中old是在数据被删除了,再去查找,就会一直找不到。

  • 参看下面案例:
CREATE TRIGGER test_tt AFTER DELETE ON `test`  FOR EACH ROW
BEGIN
UPDATE `member` SET `name` = old.name WHERE id = OLD.id;
END

在删除test表中的一行数据时,能够把删除之前的name数据写入member表中去。
可以见得old表示的是之前的一整行完整的数据,并且是通过 . 的形式访问字段内容。

------------------------------------------------------------------------------

触发器

触发器是(trigger)是个特殊的存储你过程,它的执行不是由程序调用,也不是手动启动,而是由事件来触发,比如当对一个表进行操作(INSERT,DELETE,UPDATE)时就会激活它执行。触发器经常 用来加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS, USER_TRIGGES数据字典中查到。
触发器语法

CREATE TRIGGER
trigger_name 
TRIGGER_TIME[AFTER,BEFORE] 
TRIGGER_EVENT[UPDATE,INSERT,DELETE]
ON tbl_name
FOR EACH ROW trigger_stmt

触发器实现两表同步

#同步插入
DELIMITER $ #修改定界符
DROP TRIGGER IF EXISTS sync_apps_insert$
CREATE TRIGGER sync_apps_insert AFTER INSERT ON rht_train.rht_apps FOR EACH ROW
BEGIN
INSERT INTO rht_idc.rhi_apps 
(id, appid, appname, isreward, adesc, adetail, price, downcount, sortid, iftj, flag, apptype, appcol, imgurl, ver, vernum, iconurl, filesize, lang, appurl, package, ctime, utime, stars, signature, unconfirm, develop, typeinfo) VALUES 
(NEW.id, NEW.appid, NEW.appname, NEW.isreward, NEW.adesc, NEW.adetail, NEW.price, NEW.downcount, NEW.sortid, NEW.iftj, NEW.flag, NEW.apptype, NEW.appcol, NEW.imgurl, NEW.ver, NEW.vernum, NEW.iconurl, NEW.filesize, NEW.lang, NEW.appurl, NEW.package, NEW.ctime, NEW.utime, NEW.stars, NEW.signature, NEW.unconfirm, NEW.develop, NEW.typeinfo);
END $
DELIMITER ; #还原定界符

#同步删除
DELIMITER $ #修改定界符
DROP TRIGGER IF EXISTS sync_apps_delete$
CREATE TRIGGER sync_apps_delete AFTER DELETE ON rht_train.rht_apps FOR EACH ROW
BEGIN
DELETE FROM rht_idc.rhi_apps WHERE rht_idc.rhi_apps.id=OLD.id;
END $
DELIMITER ; #还原定界符

#同步更新
DELIMITER $ #修改定界符
DROP TRIGGER IF EXISTS sync_apps_update$
CREATE TRIGGER sync_apps_update AFTER UPDATE ON rht_train.rht_apps FOR EACH ROW
BEGIN
UPDATE `rht_idc`.`rhi_apps` SET `id`=NEW.id, `appid`=NEW.appid, `appname`=NEW.appname, 
`isreward`=NEW.isreward, `adesc`=NEW.adesc, `adetail`=NEW.adetail, `price`=NEW.price, `downcount`=NEW.downcount, 
`sortid`=NEW.sortid, `iftj`=NEW.iftj, `flag`=NEW.flag, `apptype`=NEW.apptype, `appcol`=NEW.appcol, `imgurl`=NEW.imgurl, 
`ver`=NEW.ver, `vernum`=NEW.vernum, `iconurl`=NEW.iconurl, `filesize`=NEW.filesize, `lang`=NEW.lang, `appurl`=NEW.appurl, 
`package`=NEW.package, `ctime`=NEW.ctime, `utime`=NEW.utime, `stars`=NEW.stars, `signature`=NEW.signature,
`unconfirm`=NEW.unconfirm, `develop`=NEW.develop, `typeinfo`=NEW.typeinfo WHERE (rht_idc.rhi_apps.id=OLD.id);
END $
DELIMITER ; #还原定界符

如果执行返回

Trigger in wrong schema

请检查use datebases 是否是rht_train。触发器是建立在此库上的表,应当选择此库才能正常建立。

数据库

作者:益初
链接:https://www.jianshu.com/p/253f5a57ca37
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

  • MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,...
    金星show阅读 824评论 0 3
  • 触发器(触发程序)是与表有关的固定的数据库对象,当表上出现特定事件时,将激活该对象。一般用于检查给表插入新的值或者...
    原点_da4e阅读 273评论 0 0
  • 触发器是一种与表操作有关的数据库对象。当有触发器的数据表上出现指定事件时,将调用该触发器对象,即表上的操作事件触发...
    西瓜很甜哟阅读 2,315评论 0 23
  • 中性笔+炭笔.临摹 从昨晚九点多到家,到现在没出过家门。 加油,争取明天再宅一天。
    巫落阅读 99评论 0 0
  • 执子之手, 敬与客酒。 海未潮生, 云未回首。 迎夕而歌, 烟雨春秋。 斯人难守, 愿为君候。 晚安
    提拉米苏的猫阅读 276评论 0 1