MySQL触发器实现:插入tb_data后更新tb_units指定行
实现tb_data新增数据同步更新tb_units的触发器
表结构说明
tb_data表
包含字段:
- tb_id
- timestamp
- pagid(与tb_units的pag_id对应)
- proid(对应tb_units的latest_profile)
- status(对应tb_units的latest_status)
- 其他字段
tb_units表
包含字段:
- pag_id(唯一值,每个编号仅出现一次)
- pag_sn
- user
- latest_profile(同步tb_data的proid)
- latest_status(同步tb_data的status)
- latest_feedback
- latest_timestamp(同步tb_data的timestamp)
问题分析
需要在tb_data新增记录时,自动更新tb_units中对应pag_id的字段,确保tb_units始终保留每个pag_id的最新数据。你之前的触发器写法存在错误:直接引用tb_data.9C这类格式不符合语法规范,且未使用触发器专用的NEW关键字获取刚插入的记录值。
正确的触发器代码
仅更新已有记录的版本
如果tb_units中已存在所有需要同步的pag_id,使用以下触发器:
CREATE TRIGGER update_units AFTER INSERT ON tb_data BEGIN UPDATE tb_units SET latest_profile = NEW.proid, latest_status = NEW.status, latest_timestamp = NEW.timestamp WHERE pag_id = NEW.pagid; END;
支持更新或插入的版本(UPSERT)
如果存在tb_units中无对应pag_id的情况(即首次新增该pagid的记录),使用以下触发器(以SQLite为例,不同数据库语法略有差异):
CREATE TRIGGER update_or_insert_units AFTER INSERT ON tb_data BEGIN INSERT INTO tb_units (pag_id, latest_profile, latest_status, latest_timestamp) VALUES (NEW.pagid, NEW.proid, NEW.status, NEW.timestamp) ON CONFLICT(pag_id) DO UPDATE SET latest_profile = NEW.proid, latest_status = NEW.status, latest_timestamp = NEW.timestamp; END;
触发器工作原理说明
AFTER INSERT ON tb_data:指定触发器在tb_data表完成插入操作后执行NEW:触发器内置关键字,代表刚刚插入到tb_data中的新记录,通过NEW.字段名可获取该记录的对应字段值- 逻辑执行:通过新记录的
pagid匹配tb_units中的pag_id,更新对应的字段值,确保tb_units始终保存最新的数据
内容的提问来源于stack exchange,提问作者Rasmus Hansen
相关产品推荐
相关产品推荐

