Mysql数据库当字段由非0变为0,触发写入另一个数据表,创建触发器

数据表test1(字段Q1,Q2,Q3,Q4,Timenow),

数据表test2(字段Q1,Q2,Q3,Q4,Timenow),与test1不同的是Timenow是日期

需求1:

当Q1、Q2、Q3、Q4任意一个由非0,变为0时,需要将旧值记录到test2,比如test1表中的Q1为100,突然变为0,那么需要将100记录到test2表中的Q1。正常情况下,变为0不会在一天内多次发生(用户更新硬件,然后进行手动Reset时的当前值记录)。

需求2:

Q1、Q2、Q3、Q4在同一天不同时段被置为0时,需要合并到一行记录上。即避免出现同一天多行的现象。

功能开发:

创建触发器,如下语句:

说明:OLD、New均为数据库的关键字,表示旧值和新值。另外数据库的可视化工具,如Mysql Front、HeidiSQL均可右键创建触发器、事件、存储过程,不过语句还需要根据需要进行调整。

CREATE Trigger rl_test1 before update on `test1` for each row
BEGIN

#这里是判断是否有从非0变为0的存在,若有则下一步
IF(
  (Old.Q1 !='0') and (NEW.Q1='0') or
  (Old.Q2 !='0') and (NEW.Q2='0') or
  (Old.Q3 !='0') and (NEW.Q3='0') or
  (Old.Q4 !='0') and (NEW.Q4='0') )

then #若有从非0变为0,说明存在数据的Reset,重置
  #判断test2表中,是否有当天的行,若没有则新建一行,便于保存Reset前的数据
  if NOT EXISTS (SELECT * FROM test2 WHERE timenow =CURDATE()) 
  THEN
  INSERT INTO test2 (`Q1`) values ('0');#这里是插入一行,插入的数据可以是任意一个
  END IF;
END IF;

#到此,已进行非0到0的判断,且判断目标表格是否有当天的数据行,若没有则插入一行。那么此时test2已存在当天的数据行。

#判断是否为Q1的变化,若是,则更新至目标表格test2
IF((Old.Q1 !='0') and (NEW.Q1='0'))
then
update test2 set `Q1`=old.Q1 where timenow = curdate();
end if;


#判断是否为Q2的变化,若是,则更新至目标表格test2
IF((Old.Q2 !='0') and (NEW.Q2='0'))
then
update test2 set `Q2`=old.Q2 where timenow = curdate();
end if;

#判断是否为Q3的变化,若是,则更新至目标表格test2
IF((Old.Q3 !='0') and (NEW.Q3='0'))
then
update test2 set `Q3`=old.Q3 where timenow = curdate();
end if;

#判断是否为Q4的变化,若是,则更新至目标表格test2
IF((Old.Q4 !='0') and (NEW.Q4='0'))
then
update test2 set `Q4`=old.Q4 where timenow = curdate();
end if;

END

实测:可行

你可能感兴趣的:(数据库,mysql)