业务场景

任务计划会每隔一段时间去检测设备的状态保存到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
      )

语法解释

  1. conflict里的字段必须为主键或者唯一索引,可以多个字段作为唯一索引,在数据库设置唯一,不然会报 "there is no unique or exclusion constraint matching the ON CONFLICT specification"错误
  2. 插入和更新并不是批量数据一一对应操作的 而是批量insert然后再判断是否更新 所以下面只能写死一条数据 多了就报错
    pgsql在这种情况下会提供一个EXCLUDED临时表把之前插入的值储存起来
最后修改:2023 年 05 月 02 日
如果觉得我的文章对你有用,请随意赞赏