1.触发器是什么sql
2.建立触发器数据库
3.使用触发器测试
一类特殊的数据库程序,能够监视某种数据的操做(insert/update/delete),并触发相关的操做(insert/update/delete),保护数据的完整性。spa
我的理解就有点相似于Java的观察者模式,一个对象变化,观察者也跟着作出响应。设计
Mysql好像是从5.0之后开始支持触发器的。日志
建立触发器我将介绍两种方式:用语句建立,用navicat建立。code
建立触发器的语法以下:对象
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
其中,触发器名参数指要建立的触发器的名字blog
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
测试一下:新增一条数据
insert into stu (name,age) VALUES('李白',36)
查看stu表和stu_log表:
如图,触发器已经生效了!
测试删除一条数据
DELETE from stu where name = '李白'
查看stu表和stu_log表:
如图,触发器已经生效了!
本文知识初步探讨一下触发器,咱们能够用触发器实现更多的功能,如日志审计,同步复制表,自动计算等等,欢迎留言探讨!
愿你在每一个平淡无奇的日子里总会有惊喜。