我有一个简单的表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
答案 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);