MySQL:进阶巩固-触发器


一、基本概述

触发器是与表有关的数据对象,在INSERT/UPDATE/DELETE之前或者是之后,触发并执行触发器中定义的SQL语句的集合,触发器的这种特性可以在协助应用在数据库端确保数据的完整性,日志记录,数据校验等操纵。
使用别名OLD和NEW来引用触发器中发生变化的记录内容,现在的触发器只支持行级触发,不支持语句触发

  • 行级触发:每关联一行数据都会触发。
  • 语句触发:在执行这条语句时只触发一次。

二、语法结构

创建触发器

CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON table_name FOR EACH ROW --- 行级触发器
BEGIN
	...
END;

查看触发器

SHOW TRIGGERS;

删除触发器

DROP TRIGGER 数据库名.触发器名

三、基本使用

通过触发器记录用户表的变动

创建用户表

CREATE TABLE `tb_user`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `age` int NULL DEFAULT NULL,
  `sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `score` decimal(10, 2) NULL DEFAULT NULL,
  `rq` date NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;

创建用户日志表

CREATE TABLE `user_log`  (
  `id` int NOT NULL AUTO_INCREMENT,
  `operation` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作类型 insert/update/delete',
  `operation_time` datetime NOT NULL COMMENT '操作时间',
  `operation_id` int NOT NULL COMMENT '操作ID',
  `operation_params` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作参数',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

3.1 新增的触发器

编写触发器

CREATE TRIGGER tb_user_insert_trigger 
	AFTER INSERT ON tb_user FOR EACH ROW
BEGIN
	INSERT INTO user_log(operation, operation_time, operation_id, operation_params) VALUES ('insert', NOW(), new.id, CONCAT('插入的数据内容为id=', new.id, 'name=', new.name, 'age=',new.age,'sex=',new.sex,'score=',new.score,'rq=',new.rq));
END;

向用户表中插入数据,查看是否已经插入日志数据

INSERT INTO tb_user(name, age, sex, score, rq) VALUES ('测试触发器', 100, 1, 999999, NOW());

3.2 修改的触发器

编写触发器

CREATE TRIGGER tb_user_update_trigger 
	AFTER UPDATE ON tb_user FOR EACH ROW
BEGIN
	INSERT INTO user_log(operation, operation_time, operation_id, operation_params) VALUES ('update', NOW(), new.id, CONCAT(
		'更新之前的数据为id=', old.id, 'name=', old.name, 'age=',old.age,'sex=',old.sex,'score=',old.score,'rq=',old.rq,
		'更新之后的数据为id=', new.id, 'name=', new.name, 'age=',new.age,'sex=',new.sex,'score=',new.score,'rq=',new.rq));
END;

修改用户数据,查看是否已经插入日志数据

UPDATE tb_user SET age=2000 WHERE id=7;

3.3 删除的触发器

编写触发器

CREATE TRIGGER tb_user_delete_trigger 
	AFTER DELETE ON tb_user FOR EACH ROW
BEGIN
	INSERT INTO user_log(operation, operation_time, operation_id, operation_params) VALUES ('delete', NOW(), new.id, CONCAT('删除之前的数据内容为id=', old.id, 'name=', old.name, 'age=',old.age,'sex=',old.sex,'score=',old.score,'rq=',old.rq));
END;

删除用户数据,查看是否已经插入日志数据

DELETE FROM tb_user WHERE id='7';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Monly21

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值