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_stmttrigger_name:触发器的名称tirgger_time:触发时机,为BEFORE或者AFTERtrigger_event:触发事件,为INSERT、DELETE或者UPDATEtb_name:表示建立触发器的表明,就是在哪张表上建立触发器trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句所以可以说MySQL创建以下六种触发器:BEFORE INSERT,BEFORE DELETE,BEFORE UPDATEAFTER INSERT,AFTER DELETE,AFTER UPDATE

BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后

FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器

创建多个执行语句的触发器:

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件ON 表名 FOR EACH ROWBEGIN 执行语句列表END

某一个字段可以用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;

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;

如果不使用触发器,我们就需要编写代码来实现这个需求,但是触发器可以帮我们轻松的实现。

首先我们使用语句来创建一个insert触发器:

DROP TRIGGER IF EXISTS `insert_log`;delimiter ;;CREATE TRIGGER `add_log` AFTER INSERT ON `stu` FOR EACH ROW BEGININSERT INTO stu_log(name,create_time) VALUES(new.`name`,now());END;;delimiter ;

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

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

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

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

语句:

beginINSERT INTO stu_log(name,create_time) VALUES(old.`name`,now());end
insert into stu (name,age) VALUES('李白',36)

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

测试删除一条数据

DELETE from stu where name = '李白'

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

更多相关文章

  1. MySQL系列多表连接查询92及99语法示例详解教程
  2. Linux下MYSQL 5.7 找回root密码的问题(亲测可用)
  3. MySQL 什么时候使用INNER JOIN 或 LEFT JOIN
  4. android从服务器下载文件(php+apache+win7+MySql)
  5. 【有图】android通过jdbc连接mysql(附文件)
  6. Android初始化语言 (init.*.rc、init.conf文件格式)
  7. Android初始化语言 (init.*.rc、init.conf文件格式)
  8. 如何写Android(安卓)init.rc
  9. Android(安卓)监听短信2种方式:Broadcast和ContentObserver

随机推荐

  1. Linux网络管理
  2. Java异常有多慢?
  3. 原创 | CRUD更要知道的Spring事务传播机
  4. SpringBoot自适应异常处理
  5. XUECIYUYAN
  6. Linux进程管理
  7. IDEA常用设置及推荐插件
  8. 又踩到Dubbo的坑,但是这次我笑不出来
  9. mall架构及功能概览
  10. mall学习所需知识点