我想要一种相当有效的方法将整个表压缩为哈希值.

我有一些工具可以生成整个数据表,然后可以用来生成更多的表,等等.我试图实现一个简单的构建系统来协调构建运行并避免重复工作.我希望能够记录输入表的哈希值,以便以后判断它们是否已更改.构建一个表需要几分钟或几小时,所以花几秒钟构建哈希是可以接受的.

我使用的一种方法是将pg_dump的输出通过管道传输到md5sum,但这需要通过网络传输整个表转储,以便将其散列到本地框中.理想情况下,我希望在数据库服务器上生成哈希.

Finding the hash value of a row in postgresql给了我一种每次计算一行的哈希值的方法,然后可以以某种方式进行组合.

任何提示都将不胜感激.

Edit to post what I ended up with: tinychen的答案对我来说并不直接有效,因为我显然不能使用"plpgsql".当我在SQL中实现该函数时,它工作正常,但对于大型表来说效率非常低.因此,我没有将所有行哈希连接起来,然后对其进行哈希,而是转而使用"滚动哈希",将前一个哈希与行的文本表示连接起来,然后对其进行哈希以生成下一个哈希.这样好多了;显然,在短字符串上额外运行数百万次md5比将短字符串连接数百万次要好.

create function zz_concat(text, text) returns text as 
    'select md5($1 || $2);' language 'sql';

create aggregate zz_hashagg(text) (
    sfunc = zz_concat,
    stype = text,
    initcond = '');

推荐答案

只需这样创建一个哈希表聚合函数.

create function pg_concat( text, text ) returns text as '
begin
    if $1 isnull then
        return $2;
    else
       return $1 || $2;
    end if;
end;' language 'plpgsql';

create function pg_concat_fin(text) returns text as '
begin
    return $1;
end;' language 'plpgsql';

create aggregate pg_concat (
    basetype = text,
    sfunc = pg_concat,
    stype = text,
    finalfunc = pg_concat_fin);

然后可以使用pg_concat函数计算表的哈希值.

select md5(pg_concat(md5(CAST((f.*)AS text)))) from f order by id

Postgresql相关问答推荐

在Go中,如何在没有数据库包的情况下运行PostgreSQL查询?

我需要一个变量来引用上周的星期五

Docker化的PostgreSQL:FATAL:用户&postgres的密码身份验证失败

是否从表中 Select 值?巴什

在postgres中撤销Select后,RLS停止工作

在Postgre中的链接服务器上执行远程查询

右连接 postgresql 出现语法错误

在Power BI和Excel中将日期格式化为正确格式

如何重新格式化已获取的 psql 查询输出?

消除 PostgreSQL SELECT 语句中的重复行

Rails:创建删除表级联迁移

获取 OperationalError: FATAL: sorry, too many clients already using psycopg2

knex: Select 特定日期范围内的行

MAC OS X 上的 Postgres 权限被拒绝

如何防止用户看到其他数据库和其他数据库中的表?

在 postgresql 中,如何在 jsonb 键上返回布尔值而不是字符串?

将数据从 MS SQL 迁移到 PostgreSQL?

如何缩小 pg_toast 表?

Entity Framework Core jsonb 列类型

PostgreSQL - 必须出现在 GROUP BY 子句中或在聚合函数中使用