mysql 触发器 lod_MySQL--初探触发器的使用和理解

本篇文章分三步介绍触发器:

1.触发器是什么

2.创建触发器

3.使用触发器

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的使用

insertnew代表新增的数据

updatenew代表更新后的数据,old代表更新前的数据

deleteold代表要删除的数据

某一个字段可以用new/lod.字段名

接下来我们创建2个表用来测试:

stu表:主表(被观察者)

bb53c154c4bf8d110aa219a15d545850.pngDROP 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表:触发器关联表(观察者)

6c163ed50a49195b80d5549cfb9061e5.pngDROP 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 ;

执行结果:

7801c6533dd76eb7247649e485a87610.png

然后我们再用navicat创建一个delete触发器:

step1:右键stu表,选择设计表----触发器

8852178a87f8c3cafc297db2609e2308.png

step2:如图所示填选,选择删除前触发

496ae793c6f7700260a6ad2e48f9e091.png

step3:在下方定义框内写执行语句,如图   记得点保存!

9854314bfc1e5239d1f51eabd7dde583.png

语句:begin

INSERT INTO stu_log(name,create_time)  VALUES(old.`name`,now());

end

3.使用触发器

测试一下:新增一条数据insert into stu (name,age) VALUES('李白',36)

查看stu表和stu_log表:

b368e211a2d85df3ac8914acfe7d2016.png

25568df483f3ffd337fc66f01681ce38.png

如图,触发器已经生效了!

测试删除一条数据DELETE from stu where name = '李白'

查看stu表和stu_log表:

223e90e1e270de00090dca2b9ef376e0.png

a18ad605983a377f4954065cdcecdcda.png

如图,触发器已经生效了!

本文知识初步探讨一下触发器,我们可以用触发器实现更多的功能,如日志审计,同步复制表,自动计算等等,欢迎留言探讨!

愿你在每个平淡无奇的日子里总会有惊喜。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值