MySQL 触发器的使用和理解
作者:编程江湖浪客 发布时间:2024-01-17 07:09:10
目录
1.触发器是什么?
2.创建触发器
创建触发器的语法如下:
创建多个执行语句的触发器:
NEW和OLD的使用:
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的使用 |
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表:
如图,触发器已经生效了!
来源:https://www.cnblogs.com/godjoker/p/14442831.html


猜你喜欢
- 在使用SQL*LOADER装载数据时,由于平面文件的多样化和数据格式问题总会遇到形形色色的一些小问题,下面是工作中累积、整理记录的遇到的一些
- 经常会在连接DB的时候用到,就是不知道代表什么意思。。。RS.OPEN SQL,CONN,A,BA: ADOPENFORWARDONLY(=
- 一:代码实现class TreeNode: """节点类""&q
- 在我们生活中的一些场合经常会有一些不该出现的敏感词,我们通常会使用*去屏蔽它,例如:尼玛 -> **,一些骂人的敏感词和一些政治敏感词
- 本文研究的主要是Python编程argparse的相关内容,具体介绍如下。#aaa.py#version 3.5import os &nbs
- 本期做一个selenium详细实例,会把我在元素定位中遇到的一些阻塞和经验分享给大家。(浏览器为Chrome)(如果只需要最终的完整代码,请
- 前言昨天才开始接触,鼓捣了一个下午,接下来会持续更新,如果哪里有错误的地方,望各位大佬指出,谢谢!数据描述两个文件,一个文件包含了网络图的节
- 一、关于Python操作数据库的概述Python所有的数据库接口程序都在一定程度上遵守 Python DB-API 规范。DB-API定义了
- 本文通过一个csv实例文件来展示如何删除Pandas.DataFrame的行和列数据文件名为:example.csv内容为:datespri
- 在 github 的 vue-router 中找到同样的一个问题:3.0.1版本通过router实例无法跳转昨天发现有些路由不能正常跳转,找
- 场景概述众所周知,弹窗是一种常见的交互方式,而蒙层是弹窗必不可少的元素,用于隔断页面与弹窗区块,暂时阻断页面的交互。但是,在蒙层元素中滑动的
- 多线程-共享全局变量#coding=utf-8from threading import Threadimport timeg_num =
- php服务端与客户端交互、提供开放api时,通常需要对敏感的部分api数据传输进行数据加密,这时候rsa非对称加密就能派上用处了,下面通过一
- 如下所示:jsonObject 是个jsonif (key in jsonObject) : print '有'else:
- 首先第一步,打开文件,有两个函数可供选择:open() 和 file()①. f = open('file.txt
- 模块:包含定义函数和变量的python文件,可以被别的程序引入。os模块是操作系统接口模块,提供了一些方便使用操作系统相关功能函数,这里介绍
- Python中对象方法的定义很怪异,第一个参数一般都命名为self(相当于其它语言的this),用于传递对象本身,而在调用的时候则不必显式传
- 通过《SQL Server 数据库备份和还原认识和总结(一)》,相信您对数据备份和还原有了一个更深入的认识,在上文中我没有对事务日志做剖析,
- 偶然发现了for…else…这种用法,使用这个实现了break跳出嵌套的for循环In [31]: for i in range(1,5):
- 本文介绍了python中的计时器timeit的使用方法,分享给大家,具体如下:timeit通常在一段程序的前后都用上time.time(),