1.触发器是什么?
一类特殊的数据库程序,可以监视某种数据的操作(insert/update/delete),并触发相关的操作(insert/update/delete),保护数据的完整性。
个人理解就有点类似于Java的观察者模式,一个对象变化,观察者也跟着做出响应。
Mysql好像是从5.0以后开始支持触发器的。
2.创建触发器
创建触发器我将介绍两种方式:用语句创建,用navicat创建。
创建触发器的语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt trigger_name:触发器的名称 tirgger_time:触发时机,为BEFORE或者AFTER trigger_event:触发事件,为INSERT、DELETE或者UPDATE tb_name:表示建立触发器的表明,就是在哪张表上建立触发器 trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句 所以可以说MySQL创建以下六种触发器: BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE AFTER INSERT,AFTER DELETE,AFTER UPDATE
其中,触发器名参数指要创建的触发器的名字
BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后
FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器
创建多个执行语句的触发器:
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW BEGIN 执行语句列表 END
NEW和OLD的使用:
触发器类型 new和old的使用 insert new代表新增的数据 update new代表更新后的数据,old代表更新前的数据 delete old代表要删除的数据
某一个字段可以用new/lod.字段名
接下来我们创建2个表用来测试:
stu表:主表(被观察者)
DROP TABLE IF EXISTS `stu`; CREATE TABLE `stu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '姓名', `age` int(11) NULL DEFAULT NULL COMMENT '年龄', `sort` int(11) NULL DEFAULT NULL COMMENT '排序字段', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
stu_log表:触发器关联表(观察者)
DROP TABLE IF EXISTS `stu_log`; CREATE TABLE `stu_log` ( `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, `create_time` datetime(0) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
现在我们假设有这样一个业务,在stu表新增和删除数据时,同步在stu_log中记录日志,记录name和时间。
如果不使用触发器,我们就需要编写代码来实现这个需求,但是触发器可以帮我们轻松的实现。
首先我们使用语句来创建一个insert触发器:
DROP TRIGGER IF EXISTS `insert_log`; delimiter ;; CREATE TRIGGER `add_log` AFTER INSERT ON `stu` FOR EACH ROW BEGIN INSERT INTO stu_log(name,create_time) VALUES(new.`name`,now()); END ;; delimiter ;
执行结果:
然后我们再用navicat创建一个delete触发器:
step1:右键stu表,选择设计表----触发器
step2:如图所示填选,选择删除前触发
step3:在下方定义框内写执行语句,如图 记得点保存!
语句:
begin INSERT INTO stu_log(name,create_time) VALUES(old.`name`,now()); end
3.使用触发器
测试一下:新增一条数据
insert into stu (name,age) VALUES('李白',36)
查看stu表和stu_log表:
如图,触发器已经生效了!
测试删除一条数据
DELETE from stu where name = '李白'
查看stu表和stu_log表:
如图,触发器已经生效了!
以上就是MySQL 触发器的使用和理解的详细内容,更多关于MySQL 触发器的资料请关注其它相关文章!
MySQL,触发器
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。