重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
这种情况最好是每个设备增加一个表,只存储当前最新的一条数据,每次有新数据来,删除之前的数据,插入最新一条数据。这样查询时,查最新表,仅一条数据,速度很快
创新互联公司坚持“要么做到,要么别承诺”的工作理念,服务领域包括:网站设计制作、网站设计、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的铁山港网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
参考文章: 【PostgreSQL 如何实现upsert与新旧数据自动分离】
很多业务也行有这样的需求,新的数据会不断的插入,并且可能会有更新。 对于更新的数据,需要记录更新前的记录到历史表。 这个需求有点类似于审计需求,即需要对记录变更前后做审计。 本文的目的并不是审计,而且也可能不期望使用触发器。
还有什么方法呢?
PostgreSQL 这么高大上,当然有,而且还能在一句SQL里面完成,看法宝。
创建一张当前状态表,一张历史记录表。
插入一条不存在的记录,不会触发插入历史表的行为。
注意替代变量
插入一条不存在的记录,不会触发插入历史表的行为。
插入一条已存在的记录,并且有数据的变更,触发数据插入历史表的行为。
插入一条已存在的记录,并且已存在的记录值和老值一样,不会触发将数据插入历史表的行为。
执行计划
SELECT
procpid,
start,
now() - start AS lap,
current_query
FROM
(SELECT
backendid,
pg_stat_get_backend_pid(S.backendid) AS procpid,
pg_stat_get_backend_activity_start(S.backendid) AS start,
pg_stat_get_backend_activity(S.backendid) AS current_query
FROM
(SELECT pg_stat_get_backend_idset() AS backendid) AS S
) AS S
WHERE
current_query 'IDLE'
ORDER BY
lap DESC;
procpid:进程id
start:进程开始时间
lap:经过时间
current_query:执行中的sql
怎样停止正在执行的sql
SELECT pg_cancel_backend(进程id);
或者用系统函数
kill -9 进程id;