mysql 触发器-监控表字段更新

  最近想实现一个监控mysql表的某个或者某几个字段值的变化,当监控字段的值发生变化时,将原有值和更新值保存下来。想实现这个功能受限想到的就是触发器,mysql的触发器块很久没碰过了,重新拎起来还是免不了查些资料什么的。花了点时间搞定了这个触发器。这里写个小例子来记录下mysql触发器编写的过程。

mysql触发器格式如下:

CREATE TRIGGER 触发器名 触发器时间 触发事件
ON 表名 FOR EACH ROW
BEGIN
    执行语句
END注:触发器名 - 触发器的名称  触发器时间 - 触发器触发的时机,值为 BEFORE或AFTER   触发器事件 - 引起触发器触发的事件,值为INSERT或UPDATE或DELETE  表名 - 触发触发器的表名,即该触发器是建立在那张表上面的  执行语句 - 即为触发器出发后执行的操作

案例:监控表tp_temp的mobile字段,当mobile字段发生变化时,tp_temp_2建立更新记录 : 将更新前的mobile值和更新后的mobile值记录到tp_temp_2表的mobile1和mobile2中

tp_temp表:

CREATE TABLE `tp_temp` (
  `list_id` varchar(100) NOT NULL COMMENT ‘手机号‘,
  `mobile` varchar(40) DEFAULT NULL COMMENT ‘ID‘
)

tp_temp2表:

CREATE TABLE `tp_temp_2` (
  `list_id` varchar(100) DEFAULT NULL COMMENT ‘ID‘,
  `mobile1` varchar(40) DEFAULT NULL COMMENT ‘手机号1‘,
  `mobile2` varchar(40) NOT NULL COMMENT ‘手机号2‘,
  `create_time` datetime DEFAULT NULL COMMENT ‘创建时间‘
)

创建触发器trigger_test:

DELIMITER $$

CREATE
TRIGGER `mydb`.`trigger_test` BEFORE UPDATE -- mydb为数据库名
ON `mydb`.`tp_temp`
FOR EACH ROW BEGIN
SET @oldMobile = (SELECT c.mobile FROM tp_temp c WHERE c.list_id=new.list_id LIMIT 1);
IF new.mobile <> @oldMobile THEN
INSERT INTO tp_temp2(list_id,mobile1,mobile2,create_time)VALUE (new.list_id,@oldMobile,new.mobile,SYSDATE());

END IF;
END$$

DELIMITER ;

以上。

原文地址:https://www.cnblogs.com/big-xuzhou/p/10326398.html

时间: 2024-10-12 15:57:33

mysql 触发器-监控表字段更新的相关文章

MySQL查询表与表字段的信息

环境: Mysql数据库 库名:db_name 表名: table_name1 table_name2 查询一个里面所有表的信息: use information_scheam; select * from tables where table_schema = "db_name"; 查询单个表的信息: use information_scheam; select * from tables where table_schema = "db_name" and ta

A表字段更新为B表的字段值

T1表 结构 id      name       school 1       ming1      清华大学 2       ming2       北京大学 3       ming3       复旦大学 T2表  结构 id      student    school 11     ming1      牛津大学 12     ming3       剑桥大学 T1表的name 和 T2表的 student  值是 1对1 的对应. 需求:这两个字段的值相同时,根据B表的school

mysql中修改表字段名/字段长度/字段类型详解

先来看看常用的方法 MySql的简单语法,常用,却不容易记住.当然,这些Sql语法在各数据库中基本通用.下面列出: 1.增加一个字段 alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段,默认为空alter table user add COLUMN new2 VARCHAR(20) NOT NULL; //增加一个字段,默认不能为空 2.删除一个字段 alter table user DROP COLUMN ne

Mysql如何为表字段添加索引???

1.添加PRIMARY KEY(主键索引): ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 2.添加UNIQUE(唯一索引) : ALTER TABLE `table_name` ADD UNIQUE ( `column` ) 3.添加INDEX(普通索引) : ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 4.添加FULLTEXT(全文索引) : ALTER T

Mysql数据库一个表字段中存了id,并以逗号分隔,id对应的详细信息在另一个表中

有两张表, 一张为爱好表b表 一张为用户表 u表 u表 id   名称   爱好Id 1    张三     1,2,3,4 2    李四      2,5 b表 id  名称 1    打乒乓 2    打羽毛球 3   打蓝球 4    上网玩游戏 5   打牌 正常查询u表 select * from u 现在需求是: id  名称   爱好 1  张三    打乒乓,打羽毛球,打篮球,上网 2 李四    打羽毛球,打牌 修改sql为 select u.id,u.名称,group_co

Python全栈 MySQL 数据库 (表字段增、删、改)

ParisGabriel 每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰  开局一张图 打字 回车时不小心发布了  正在编辑中.............. 原文地址:https://www.cnblogs.com/ParisGabriel/p/9398614.html

MySQL生产库中添加修改表字段引起主从崩溃的问题总结

上周末和开发人员对线上库中的部分表的在线DDL和update,这过程中出现了一些意料之外的问题,现将过程.分析和解决方案在这里总结一下 一. 需求背景: 要在如下表中添加字段(modified_at)并且更改默认值 table_name { baby_compbaby_comp_statusbaby_usrbaby_ad_userbaby_campbaby_ordbaby_acc_eva } 每张表执行如下操作ALTER TABLE `$table_name` ADD COLUMN `modif

MySQL建表字段类型

1.数据库:在MySQL中,要存储数据,必须从数据库开始,因此首先要创建数据库,但由于学校的MySQL服务器对学生数据帐号有限止,学生不得创建数据库,故每个学生的帐号中已事先由信息中心为大家建立了一个名为帐号名的数据库.但我们必须了解创建数据库的语句为CREATE DATABASE <数据库名>2.数据表:是构成数据库的一个基本单位,在一个数据库中用户可以建立多张数据表.这是我们有权力建立的.3.数据表结构:创建一个数据表的第一步即为创建数据表结构,在数据表结构中的内容包括:有几个字段,每个字

mysql 对插入超过表字段限制时的处理

mysql在插入时,比如varchar类型超过表字段限制时,经测试不同版本的处理:    5.1版本,会对字符串进行截断后插入,不会报错    5.6,5.7版本,会直接插入失败,并报错