MySQL 触发器的使用和理解
1.触发器是什么?
一类特殊的数据库程序,可以监视某种数据的操作(insert/update/delete),并触发相关的操作(insert/update/delete),保护数据的完整性。
个人理解就有点类似于Java的观察者模式,一个对象变化,观察者也跟着做出响应。
Mysql好像是从5.0以后开始支持触发器的。
2.创建触发器
创建触发器我将介绍两种方式:用语句创建,用navicat创建。
创建触发器的语法如下:
CREATETRIGGERtrigger_nametrigger_timetrigger_eventONtb_nameFOREACHROWtrigger_stmt trigger_name:触发器的名称 tirgger_time:触发时机,为BEFORE或者AFTER trigger_event:触发事件,为INSERT、DELETE或者UPDATE tb_name:表示建立触发器的表明,就是在哪张表上建立触发器 trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句 所以可以说MySQL创建以下六种触发器: BEFOREINSERT,BEFOREDELETE,BEFOREUPDATE AFTERINSERT,AFTERDELETE,AFTERUPDATE
其中,触发器名参数指要创建的触发器的名字
BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后
FOREACHROW表示任何一条记录上的操作满足触发事件都会触发该触发器
创建多个执行语句的触发器:
CREATETRIGGER触发器名BEFORE|AFTER触发事件 ON表名FOREACHROW BEGIN 执行语句列表 END
NEW和OLD的使用:
触发器类型 | new和old的使用 |
insert | new代表新增的数据 |
update | new代表更新后的数据,old代表更新前的数据 |
delete | old代表要删除的数据 |
某一个字段可以用new/lod.字段名
接下来我们创建2个表用来测试:
stu表:主表(被观察者)
DROPTABLEIFEXISTS`stu`; CREATETABLE`stu`( `id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'id', `name`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULLCOMMENT'姓名', `age`int(11)NULLDEFAULTNULLCOMMENT'年龄', `sort`int(11)NULLDEFAULTNULLCOMMENT'排序字段', PRIMARYKEY(`id`)USINGBTREE )ENGINE=InnoDBAUTO_INCREMENT=18CHARACTERSET=utf8mb4COLLATE=utf8mb4_general_ciROW_FORMAT=Dynamic;
stu_log表:触发器关联表(观察者)
DROPTABLEIFEXISTS`stu_log`; CREATETABLE`stu_log`( `id`int(11)UNSIGNEDNOTNULLAUTO_INCREMENT, `name`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_general_ciNULLDEFAULTNULL, `create_time`datetime(0)NULLDEFAULTNULL, PRIMARYKEY(`id`)USINGBTREE )ENGINE=InnoDBAUTO_INCREMENT=7CHARACTERSET=utf8mb4COLLATE=utf8mb4_general_ciROW_FORMAT=Dynamic;
现在我们假设有这样一个业务,在stu表新增和删除数据时,同步在stu_log中记录日志,记录name和时间。
如果不使用触发器,我们就需要编写代码来实现这个需求,但是触发器可以帮我们轻松的实现。
首先我们使用语句来创建一个insert触发器:
DROPTRIGGERIFEXISTS`insert_log`; delimiter;; CREATETRIGGER`add_log`AFTERINSERTON`stu`FOREACHROWBEGIN INSERTINTOstu_log(name,create_time)VALUES(new.`name`,now()); END ;; delimiter;
执行结果:
然后我们再用navicat创建一个delete触发器:
step1:右键stu表,选择设计表----触发器
step2:如图所示填选,选择删除前触发
step3:在下方定义框内写执行语句,如图 记得点保存!
begin INSERTINTOstu_log(name,create_time)VALUES(old.`name`,now()); end
3.使用触发器
测试一下:新增一条数据
insertintostu(name,age)VALUES('李白',36)
查看stu表和stu_log表:
如图,触发器已经生效了!
测试删除一条数据
DELETEfromstuwherename='李白'
查看stu表和stu_log表:
如图,触发器已经生效了!
以上就是MySQL触发器的使用和理解的详细内容,更多关于MySQL触发器的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。