从历史表中提取Mysql并保留历史表

时间:2020-02-08 03:35:28

标签: mysql sql

我有一个简单的表machine_info,

+-------+-------+-------+-------+--------------------------+
|Module |Machine|  VAL  |  FLG  |      Timestamp           |
+-------+-------+-------+-------+------------------------- +
|  T-01 |  Tron  |   1  |  Y    |   2020-01-01 11:22:33    | 
|  T-01 |  Tron  |   2  |  Y    |   2020-01-01 11:23:33    | 
|  T-01 |  Tron  |   1  |  Y    |   2020-01-01 11:24:33    |
|  T-02 |  Volt  |   4  |  Y    |   2020-01-01 11:25:33    |
+-------+-------+-------+-------+--------------------------+

我正在尝试实现以下结果:第二个新表项出现(例如,倒数第二行 T-01 Tron 和< strong> 1 第二次以较新的时间戳记值出现),有触发器或某种东西可以将最新记录仅推送到新表,以便重复输入Module,Machine和Val,但时间戳记较新

新表将是machine_info的精确副本,但仅包含具有最新时间戳的唯一模块,机器和VAL组合的一个条目。像

    +-------+-------+-------+-------+--------------------------+
    |Module |Machine|  VAL  |  FLG  |      Timestamp           |
    +-------+-------+-------+-------+------------------------- +
    |     
    |  T-01 |  Tron  |   2  |  Y    |   2020-01-01 11:23:33    | 
    |  T-01 |  Tron  |   1  |  Y    |   2020-01-01 11:24:33    |
    |  T-02 |  Volt  |   4  |  Y    |   2020-01-01 11:25:33    |
    +-------+-------+-------+-------+--------------------------+

如果machine_info表中再次出现T-01,Tron,1,则副本表应使用较新的时间戳记值覆盖该组合的现有值,并保留副本中的其他行。同样适用于所有此类唯一组合。

最后,将有一个表包含所有历史信息,而另一个表仅包含最新记录。

我应该采取什么方法来实现这一目标?我正在使用mysql-5.7.7

1 个答案:

答案 0 :(得分:0)

您可以使用触发器来执行此操作。定义目标表,例如machine_info_latest,以匹配原始表。然后在(Module, Machine, VAL)上添加唯一列或约束。

然后您在machine_info上的插入触发器可以使用insert . . . on duplicate key update

insert into machine_info_lastest (Module, Machine, VAL, FLG, Timestamp)
    values (new.Module, new.Machine, new.VAL, new.FLG, new.Timestamp)
    on duplicate key update
        FLG = values(FLG),
        Timestamp = values(Timestamp);