MySQL 触发器的使用和理解

 更新时间:2021年02月25日 11:04:51   作者:编程江湖浪客  
这篇文章主要介绍了MySQL 触发器的使用和理解,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下

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笔记之系统信息函数详解

    MySQL笔记之系统信息函数详解

    本篇文章对MySQL系统信息函数进行了详解的介绍。需要的朋友参考下
    2013-05-05
  • MySQL 重写查询语句的三种策略

    MySQL 重写查询语句的三种策略

    这篇文章主要介绍了MySQL 重写查询语句的三种策略,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下
    2021-05-05
  • Windows下MySQL安装配置方法图文教程

    Windows下MySQL安装配置方法图文教程

    这篇文章主要为大家分享了Windows下MySQL安装配置方法图文教程,感兴趣的朋友可以参考一下
    2016-06-06
  • 解析mysql中如何获得数据库的大小

    解析mysql中如何获得数据库的大小

    本篇文章是对mysql中如何获得数据库的大小的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL打印死锁日志的方法步骤

    MySQL打印死锁日志的方法步骤

    本文主要介绍了MySQL打印死锁日志的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • MySql报错Table mysql.plugin doesn’t exist的解决方法

    MySql报错Table mysql.plugin doesn’t exist的解决方法

    一般产生原因是手工更改my.ini的数据库文件存放地址导致的,大家可以参考下下面的方法
    2013-02-02
  • mysql删除操作其实是假删除问题

    mysql删除操作其实是假删除问题

    这篇文章主要介绍了mysql删除操作其实是假删除问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • MySQL索引详细解析

    MySQL索引详细解析

    索引是有双面性的,合理的建立索引可以提高数据库的效率。但是如果没有合理的构建索引和使用索引,可能会导致索引失效或者影响数据库性能,这篇文章主要介绍了MySql索引原理与操作
    2022-10-10
  • macOS安装Solr并索引MySQL

    macOS安装Solr并索引MySQL

    这篇文章主要介绍了macOS安装Solr并索引MySQL的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • mysql创建时间字段添加默认值方式

    mysql创建时间字段添加默认值方式

    这篇文章主要介绍了mysql创建时间字段添加默认值方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论