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

Posted 墨林2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 触发器-监控表字段更新相关的知识,希望对你有一定的参考价值。

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

mysql触发器格式如下:

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

案例:监控表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 ;

 

以上。

 





















以上是关于mysql 触发器-监控表字段更新的主要内容,如果未能解决你的问题,请参考以下文章

有两个mysql表,两个表中的字段一样,其中一个表更新的时候,另一个表也会更新,怎样做到呢?

插入新行表1复制到表2选定字段后mysql触发器没有重复

触发器处理表更新

MySQL 更新一个字段,表中的其他datetime类型字段全部变成了当前时间。

Navicat for mysql 中 当表一数据更新后,自动更新表2数据

Oracle 建立触发器比较两张表相同字段的数据,再更新另一个字段