Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 版本表数据清理_Sql_Postgresql - Fatal编程技术网

Sql 版本表数据清理

Sql 版本表数据清理,sql,postgresql,Sql,Postgresql,auditversion列对于每个唯一id自动递增。版本对于相同id递增。对于新id,它从1开始 我计划写一个清理查询。要求是这样的 保留最新的30个版本 如果记录在2020-08-01某一天之后最后一次更新,请不要删除该记录。因此,在2020-08-01年之后,我们有可能会有超过30个版本的项目。 这就是我到目前为止所做的: CREATE TABLE audit_table ( id varchar(30) NOT NULL, auditversion int4 NOT NUL

auditversion列对于每个唯一id自动递增。版本对于相同id递增。对于新id,它从1开始

我计划写一个清理查询。要求是这样的

保留最新的30个版本 如果记录在2020-08-01某一天之后最后一次更新,请不要删除该记录。因此,在2020-08-01年之后,我们有可能会有超过30个版本的项目。 这就是我到目前为止所做的:

CREATE TABLE audit_table (
    id varchar(30) NOT NULL,
    auditversion int4 NOT NULL,
    value jsonb NOT NULL,
    delta text[] NULL,
    src text NOT NULL,
    usr text NOT NULL,
    meta hstore NULL,
    last_updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT audit_table PRIMARY KEY (id,auditversion)
);

如果可以用更好的方式写,请告诉我。

我觉得您的查询很好


您可以考虑的另一种方法是在INSERT或UPDATE上添加一个触发器,在每次数据修改时清除NeX.ID的旧条目。这可能是更大的工作量,但避免了一个长时间运行的DELETE语句。

谢谢。此表更新更频繁。因此,使用触发器可能会降低系统正常运行的速度。此删除将安排在低负载时间进行。
delete from audit_table pa
using (select id,  MAX(a.auditversion) as maxVersion 
       FROM audit_table a group by id) pm 
where pm.id = pa.id
  and pa.auditversion <= (pm.maxVersion-30)
  and pa.last_updated < '2020-08-01';