首页 > 解决方案 > Mysql从历史表中提取并保留历史表

问题描述

我有一个简单的表 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-01Tron1第二次以较新的时间戳值出现)有触发器或其他东西仅将最新记录推送到新表中,以便重复输入 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    |
    +-------+-------+-------+-------+--------------------------+

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

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

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

标签: mysqlsql

解决方案


您可以使用触发器来执行此操作。定义目标表,比如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);

推荐阅读