业务场景
任务计划会每隔一段时间去检测设备的状态保存到A表,我们需要保存设备最后一次的检测状态到B表
SQL数据表示例
首先我们有两张表,一张是device_last_status(用于存储设备最后一次检测状态),另一张是device_plan(用于存储每次计划的检测记录)
SQL语句
insert into device_last_status (device_id, online, real_video)
select device_id,
online,
real_video
from device_plan as p
where "planId" = '1'
on conflict (device_id)
do update set (device_id, online, real_video) =
(
EXCLUDED.device_id,
EXCLUDED.online,
EXCLUDED.real_video
)
语法解释
- conflict里的字段必须为主键或者唯一索引,可以多个字段作为唯一索引,在数据库设置唯一,不然会报 "there is no unique or exclusion constraint matching the ON CONFLICT specification"错误
- 插入和更新并不是批量数据一一对应操作的 而是批量insert然后再判断是否更新 所以下面只能写死一条数据 多了就报错
pgsql在这种情况下会提供一个EXCLUDED临时表把之前插入的值储存起来
1 条评论
不错不错,我喜欢看